繁体   English   中英

在C ++中处理UTF-8

[英]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

看看第一个答案。 我确定它能回答您的问题。

  1. 什么时候应该在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM