在c++中处理UTF-8

Handling UTF-8 in C++

本文关键字:UTF-8 处理 c++      更新时间:2023-10-16

为了确定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

看一下第一个答案。我相信它回答了你的问题。

  1. 当我应该使用std::wstring std::string?
在Linux上

?几乎从不(§)。

Windows上的

?几乎总是(§)。

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

但是基于unix的系统,如Mac OS X或Linux使用UTF8。当然,这只是你如何处理数组中的字节的问题,所以你可以将UTF16字符串存储在普通的C数组或std:string容器中。这就是为什么你在跨平台代码中看不到任何字符串;相反,所有字符串都作为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)是正确的

请记住,在启动主程序时,默认选择"C"区域设置。如果处理utf-8,您可能不希望这样。调用setlocale(LC_CTYPE, "")将关闭此默认值,并且您将获得在环境中定义的任何内容(假设是utf-8区域设置)。