C++ 如何在Linux/OS X上打印wstring?
如何在控制台/屏幕上打印这样的字符串:C++ 如何在Linux/OS X上打印wstring?,c++,unicode,wstring,C++,Unicode,Wstring,如何在控制台/屏幕上打印这样的字符串:€a、cée?我试过这个: #include <iostream> #include <string> using namespace std; wstring wStr = L"€áa¢cée£"; int main (void) { wcout << wStr << " : " << wStr.length() << endl; return 0; }
€a、cée
?我试过这个:
#include <iostream>
#include <string>
using namespace std;
wstring wStr = L"€áa¢cée£";
int main (void)
{
wcout << wStr << " : " << wStr.length() << endl;
return 0;
}
它在同一个控制台上正确地打印出字符串。在C++中我缺少什么(我只是一个NoOB)?干杯
更新1:基于n.m.的建议
#include <iostream>
#include <string>
using namespace std;
string wStr = "€áa¢cée£";
char *pStr = 0;
int main (void)
{
cout << wStr << " : " << wStr.length() << endl;
pStr = &wStr[0];
for (unsigned int i = 0; i < wStr.length(); i++) {
cout << "char "<< i+1 << " # " << *pStr << " => " << pStr << endl;
pStr++;
}
return 0;
}
#include <iostream>
#include <string>
using namespace std;
wchar_t wStr[] = L"€áa¢cée£";
int iStr = sizeof(wStr) / sizeof(wStr[0]); // length of the string
wchar_t *pStr = 0;
int main (void)
{
setlocale (LC_ALL,"");
wcout << wStr << " : " << iStr << endl;
pStr = &wStr[0];
for (int i = 0; i < iStr; i++) {
wcout << *pStr << " => " << static_cast<void*>(pStr) << " => " << pStr << endl;
pStr++;
}
return 0;
}
作为最后一个cout输出。所以,我认为,实际问题仍然存在。干杯
更新2:基于n.m.的第二个建议
#include <iostream>
#include <string>
using namespace std;
string wStr = "€áa¢cée£";
char *pStr = 0;
int main (void)
{
cout << wStr << " : " << wStr.length() << endl;
pStr = &wStr[0];
for (unsigned int i = 0; i < wStr.length(); i++) {
cout << "char "<< i+1 << " # " << *pStr << " => " << pStr << endl;
pStr++;
}
return 0;
}
#include <iostream>
#include <string>
using namespace std;
wchar_t wStr[] = L"€áa¢cée£";
int iStr = sizeof(wStr) / sizeof(wStr[0]); // length of the string
wchar_t *pStr = 0;
int main (void)
{
setlocale (LC_ALL,"");
wcout << wStr << " : " << iStr << endl;
pStr = &wStr[0];
for (int i = 0; i < iStr; i++) {
wcout << *pStr << " => " << static_cast<void*>(pStr) << " => " << pStr << endl;
pStr++;
}
return 0;
}
为什么在那里报告为
9
而不是8
?或者这就是我应该期待的?干杯 将L
放在字符串文本之前。使用std::string
,而不是std::wstring
UPD:有一个更好(正确)的解决方案。保留wchar\u t、wstring和L,并在程序开始时调用setlocale(LC\u ALL,”)
无论如何,您应该在程序开始时调用setlocale(LC_ALL,”)
。这将指示程序使用环境的区域设置,而不是默认的“C”区域设置。您的环境有一个UTF-8,所以一切都应该正常工作
在不调用setlocale(LC_ALL,“”)的情况下,程序使用UTF-8序列,而没有“意识到”它们是UTF-8。如果终端上打印了正确的UTF-8序列,它将被解释为UTF-8,一切看起来都很好。如果您使用string
和char
,就会发生这种情况:gcc使用UTF-8作为字符串的默认编码,ostream会愉快地打印它们,而不应用任何转换。它认为它有一个ASCII字符序列
但是当您使用wchar\u t
时,一切都会中断:gcc使用UTF-32,没有应用正确的重新编码(因为区域设置是“C”),并且输出是垃圾
当您调用setlocale(LC_ALL,“”)
时,程序知道它应该将UTF-32重新编码为UTF-8,并且一切都很好
这一切都假设我们只想使用UTF-8。使用任意区域设置和编码超出了本答案的范围。源代码文件的编码是什么?ASCII?可能重复:@selalerer:“源文件的编码”-如python中的
#-*-编码:utf-8-*-
?如何在C++中知道或设置?我只是用vim来写脚本。干杯@Mac每个源文件都只是一个文本文件。每个文本文件都有一些编码,它可以是基于ASCII表(其中每个字符都是一个字节)或UTF-8或UTF-16等的东西。。。现在,每个文本编辑器都支持保存您选择的编码文件。如何在vim中执行此操作@selalerer:就是这样:uniTest.cpp:UTF-8 Unicode c程序文本
。如果不是的话,我会很惊讶。VIM被以同样的方式用于每一件事情,而Python工作但C++不使用。你还有什么东西不见了吗?干杯哇!这确实有效。这让我问了另一个问题:wstring
(因此,我认为也是wchar\t
)实际上是为了什么?干杯wchar\u t
是一种模糊不清的类型,它“大到足以容纳系统字符集中的任何字符”,但这完全取决于您的平台如何处理它。通常,您必须使用mbstowcs
/wcstombs
函数,或printf
中的%Ls
等将其与环境进行接口,以获取我对该主题的一点咆哮,或显式Unicode字符串。@n.m.:嗯,我现在不太确定它是否真的有效:如果我尝试这样的方法:cout@Kerrek SB:谢谢你的链接。在任何平台/OS上都支持C++0x
?干杯GCC4.3及以上版本以及MSVS2010都支持C++0x。不知道其他编译器。。。
€áa¢cée£ : 9
€ => 0x1000010e8 => €áa¢cée£
á => 0x1000010ec => áa¢cée£
a => 0x1000010f0 => a¢cée£
¢ => 0x1000010f4 => ¢cée£
c => 0x1000010f8 => cée£
é => 0x1000010fc => ée£
e => 0x100001100 => e£
£ => 0x100001104 => £
=> 0x100001108 =>