如何打印宽字符串

How to print wide character string?

本文关键字:字符串 打印 何打印      更新时间:2023-10-16

西里尔字母小写字母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。无论如何,西里尔字母没有正确打印出来。(其他字符都可以。)

我对wchar_t的东西完全是个新手,所以如果这个问题太初级,我道歉。我尝试用宽字符串打印西里尔字母时出了什么问题?这是字母在执行范围字符集中的表示问题吗(毕竟这个字符集是什么)?还是iostream设施使用不当的问题?

来源:http://www.cplusplus.com/reference/iostream/cout/

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

所以只使用两者中的一个。