Cyrillic小写字母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;
通过u8str
成功打印了西里尔文小写字母a,但不是wstr
。
对于u8str
,我已经确认其存储是使用这些字符的utf-8编码值初始化的(西里尔文小写字母a占用2个字节,值为D0 B0
)。一切似乎都没问题。西里尔文得到了正确印刷。
对于wstr
,我认为wchar_t
数组中的每个wstr
都使用执行宽字符集中字符编码的数值进行初始化。虽然我不完全理解execution wide-character set
是什么,但我检查了存储在数组中的Cyrillic小写字母的值是0x430
。无论如何,西里尔字母没有正确打印。 (其他字符都可以。)
我对wchar_t
的东西都是新手,所以如果这个问题过于简单,我会道歉。我尝试使用宽字符串打印西里尔字母时出了什么问题?这是执行宽字符集中字母表示的问题(毕竟这个字符集是什么)?或者是关于错误使用iostream工具的问题?
答案 0 :(得分:1)
来自:http://www.cplusplus.com/reference/iostream/cout/
程序不应该将cout上的输出操作与wcout上的输出操作(或stdout上的其他面向广泛的输出操作)混合:一旦对任一个执行了输出操作,标准输出流就会获得一个方向(窄或者只能通过在stdout上调用freopen来安全地更改。
所以只能使用其中一个。