[英]Handling UTF-8 in C++
为了找出C ++是否适合我的项目,我想测试UTF-8功能。 根据参考,我构建了以下示例:
#include <string>
#include <iostream>
using namespace std;
int main() {
wstring str;
while(getline(wcin, str)) {
wcout << str << endl;
if(str.empty()) break;
}
return 0;
}
但是,当我输入UTF-8字符时,它的行为不正确:
$ > ./utf8
Hello
Hello
für
f
$ >
它不仅不会打印ü
,而且会立即退出。 gdb
告诉我没有崩溃,但是正常退出,但是我很难相信。
在Linux上不要使用wstring。
std :: wstring VS std :: string
看看第一个答案。 我确定它能回答您的问题。
- 什么时候应该在std :: string上使用std :: wstring?
在Linux上? 几乎从不 (§)。
在Windows上? 几乎总是 (§)。
语言本身与unicode或任何其他字符编码无关。 它与操作系统绑定。 Windows将UTF16用于Unicode支持,这意味着使用宽字符(16位宽字符)-wchar_t或std:wstring。 每个使用字符串运行的Win Api函数都需要宽字符输入。
但是基于Unix的系统(例如Mac OS X或Linux)使用UTF8。 当然-这只是如何处理数组中的字节的问题,因此您可以将UTF16字符串存储在公共C数组或std:string容器中。 这就是为什么您在跨平台代码中看不到任何字符串的原因。 而是将所有字符串都作为UTF8处理,并在必要时(在Windows上)重新编码为UTF16。
您还有更多选择来处理这些令人困惑的事情。 我亲自完成了上述操作-通过在所有应用程序中严格使用UTF8编码,在与Windows Api交互时重新编码字符串,并在Mac OS X上直接使用它们。对于成功的重新编码,我使用了出色的转换助手:
C ++ UTF-8转换帮助器 (在MSDN上,根据Apache许可,版本2.0提供)。
您还可以使用跨平台的Qt字符串,该字符串定义从UTF8到UTF16的转换函数以及其他编码(ANSI,Latin ...)。
因此,以上答案-在Unix上始终使用UTF8(std :: string,char),在Windows UTF16(std :: wstring,wchar_t)上为true。
请记住,在启动主程序时,默认选择“ C”语言环境。 如果您处理utf-8,则可能不希望这样做。 调用setlocale(LC_CTYPE, "")
将关闭此默认设置,您将获得环境中定义的任何内容(大概是utf-8语言环境)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.