【问题标题】:How to print wide character string?如何打印宽字符串?
【发布时间】:2014-02-25 12:36:51
【问题描述】:

西里尔小写a的ISO-10646码位值为0x430,所以我尝试了以下:

char u8str[] = u8"Cyrillic lowercase a is: \u0430.";
cout << u8str;

wchar_t wstr[] = L"Cyrillic lowercase a is: \u0430.";
wcout << wstr;

西里尔字母小写a通过u8str成功打印,但不是wstr

至于u8str,我已经确认它的存储是用这些字符的utf-8编码值初始化的(西里尔小写字母a占用2个字节,值为D0 B0)。一切似乎都很好。西里尔字母打印正确。

至于wstr,我假设wstr数组中的每一个wchar_t都是用执行宽字符集中字符的编码的数值来初始化的。虽然我不完全理解execution wide-character set 是什么,但我检查了存储在数组中的西里尔字母小写a 的值是0x430。无论如何,西里尔字母没有正确打印。 (其他字符都OK。)

我是wchar_t 的新手,所以如果这个问题太简单了,我很抱歉。我尝试使用宽字符串打印西里尔字母时出了什么问题?这是执行宽字符集中字母表示的问题(毕竟这个字符集是什么)?还是 iostream 设施使用不当的问题?

【问题讨论】:

    标签: c++ character-encoding


    【解决方案1】:

    发件人:http://www.cplusplus.com/reference/iostream/cout/

    程序不应将 cout 上的输出操作与 wcout 上的输出操作(或与 stdout 上的其他面向宽的输出操作)混合:一旦对任一输出操作执行了输出操作,标准输出流将获取一个方向(窄或宽)只能通过在标准输出上调用 freopen 来安全地更改。

    所以只能使用两者之一。

    【讨论】:

    • 我实际上分别运行了这两个案例。为了方便起见,他们被放在一起。抱歉,不清楚这一点。
    • 您需要为您的应用程序启用 Unicode。对于 MSVC,您可以使用 _setmode(_fileno(stdout), _O_U16TEXT);在你的主要开始。但是对于 mingw,这有点困难,请参见此处:sourceforge.net/apps/trac/mingw-w64/wiki/Unicode%20apps
    • 这是否意味着它更多的是 iostream 设施的问题,而不是希腊字母的执行宽字符集表示?
    • 至于执行字符集,我很清楚。在 Linux 上几乎总是 utf-8。在 Windows 上,如果系统区域设置为英语,其他区域设置为其他编码(例如中文为 cp936),则为 Windows-1252。这些可以通过检查 char 数组的字节内容很容易观察到,例如:char str[] = "Greek lowercase alphs is: \u03B1."; 但是对于执行宽字符集,我不太了解。
    • 似乎 ISO-10646 值 0x3B1 总是存储在 wchat_t 数组中,声明如下:wchar_t wstr[] = L"Greek lowercase alphs is: \u03B1.";,所以我猜执行宽字符集很可能是 UCS-2/UCS -4(不同的环境有不同的 wchar_t 大小)。但是我从来没有成功地打印出宽字符数组。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 2015-12-31
    • 2014-12-12
    • 2015-06-04
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多