在C++中处理UTF-8

Lan*_*nbo 12 c++ linux stl utf-8 wstring

要了解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;
}
Run Code Online (Sandbox Code Playgroud)

但是当我输入一个UTF-8字符时,它行为不端:

$ > ./utf8 
Hello
Hello
für
f
$ >
Run Code Online (Sandbox Code Playgroud)

它不仅不会打印ü,而且会立即退出.gdb告诉我没有崩溃,但正常退出,但我发现很难相信.

小智 10

不要在Linux上使用wstring.

std :: wstring VS std :: string

看看第一个答案.我相信它会回答你的问题.

  1. 什么时候我应该使用std :: wstring而不是std :: string?

在Linux上?几乎从不 (§).

在Windows上?几乎总是 (§).


vit*_*kot 10

语言本身与unicode或任何其他字符编码无关.它与操作系统有关.Windows使用UTF16支持unicode,这意味着使用宽字符(16位宽字符) - wchar_t或std:wstring.每个使用字符串操作的Win Api函数都需要宽字符输入.

但基于unix的系统,即Mac OS X或Linux使用UTF8.当然 - 这只是你如何处理数组中的字节的问题,因此你可以将UTF16字符串存储在公共C数组或std:string容器中.这就是为什么你没有在跨平台代码中看到任何wstrings; 相反,所有字符串都作为UTF8处理,并在必要时重新编码为UTF16(在Windows上).

你有更多选择如何处理这个有点令人困惑的东西.我个人如上所述 - 通过在所有应用程序中严格使用UTF8编码,在与Windows Api交互时重新编码字符串并在Mac OS X上直接使用它们.对于win重新编码,我使用了很棒的转换助手:

C++ UTF-8转换助手(在MSDN上,在Apache许可证2.0版本下提供).

您还可以使用跨平台的Qt String,它定义从UTF8到UTF16的转换函数和其他编码(ANSI,Latin ...).

所以上面的答案 - 在unix上总是使用UTF8(std :: string,char),在Windows UTF16(std :: wstring,wchar_t)上是真的.