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;西里尔小写字母a通过u8str成功打印,但不通过wstr打印。
至于u8str,我已经确认它的存储是用这些字符的utf-8编码值初始化的(西里尔小写a占用2字节和值D0 B0)。一切看起来都很好。西里尔字母被正确打印出来了。
至于wstr,我假设wstr数组中的每个wchar_t都是用执行宽字符集中字符编码的数值来初始化的。虽然我不完全理解execution wide-character set是什么,但是我检查了存储在数组中的西里尔小写的值是0x430。不管怎样,西里尔字母没有被正确打印出来。(其他字符都可以。)
我是wchar_t的新手,所以如果这个问题太初级的话,我很抱歉。我用宽字符串打印西里尔字母时出了什么问题?这是一个字母在执行宽字符集中的表示问题(毕竟这个字符集是什么)?抑或是有关碘流设施使用不当的问题?
发布于 2014-02-25 12:42:28
来自:http://www.cplusplus.com/reference/iostream/cout/
程序不应将cout上的输出操作与wcout上的输出操作(或与stdout上的其他面向宽的输出操作)混合使用:一旦在其中任何一个上执行了输出操作,标准输出流就会获得一个只能在stdout上调用freopen才能安全更改的方向(无论是窄的还是宽的)。
所以只使用两个中的一个。
https://stackoverflow.com/questions/22014433
复制相似问题