要了解C ++是否是我的项目的正确语言,我想testingUTF-8的function。 根据参考资料,我build立了这个例子:
#include <string> #include <iostream> using namespace std; int main() { wstring str; while(getline(wcin, str)) { wcout << str << endl; if(str.empty()) break; } return 0; }
但是当我input一个UTF-8字符时,它会出错:
$ > ./utf8 Hello Hello für f $ >
不仅不打印ü
,而且还会立即退出。 gdb
告诉我没有崩溃,但是一个正常的退出,但我觉得很难相信。
不要在Linux上使用wstring。
std :: wstring VS std :: string
先看看答案。 我相信它会回答你的问题。
- 当我应该使用std :: wstring std :: string?
在Linux上? 几乎从不 (§)。
在Windows上? 几乎总是 (§)。
语言本身与unicode或任何其他字符编码无关。 它绑定到操作系统。 Windows使用UTF16的Unicode支持,这意味着使用宽字符(16位宽字符) – wchar_t或std:wstring。 每个使用字符串运行的Win Api函数都需要宽字符输入。
但基于Unix的系统,如Mac OS X或Linux使用UTF8。 当然,这只是你在数组中处理字节的一个问题,所以你可以用通用的C数组或者std:string容器来存储UTF16字符串。 这就是为什么你在跨平台代码中看不到任何wstrings的原因。 相反,所有的字符串都是以UTF8的形式处理的,并且在必要时重新编码为UTF16(在窗口上)。
你有更多的选择如何处理这个有点混乱的东西。 我个人这样做,如上所述 – 在所有应用程序中严格使用UTF8编码,在与Windows API交互时重新编码字符串,并直接在Mac OS X上使用它们。对于重新编码,我使用了很好的转换助手:
C ++ UTF-8转换助手 (在MSDN上,可在Apache许可证2.0版下获得)。
你也可以使用跨平台的Qt字符串,它定义了从UTF8到UTF16和其他编码(ANSI,Latin …)的转换函数。
所以上面的答案 – 关于unix在Windows UTF16(std :: wstring,wchar_t)上总是使用UTF8(std :: string,char)是真的。
请记住,在主程序启动时,“C”区域设置被选为默认值。 如果你处理UTF-8,你可能不需要这个。 调用setlocale(LC_CTYPE, "")
会关闭这个默认设置,并得到环境中定义的任何东西(大概是utf-8语言环境)。