2014-02-25 73 views
0

西里尔的ISO-10646代码点值小写a为0x430,所以我尝试以下:如何打印宽字符串?

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

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

的西里尔小写一个被成功地通过u8str打印,但不wstr

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

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

我是一个总新手wchar_t的东西,所以我道歉,如果这个问题太简单了。在尝试使用宽字符串打印西里尔字母时出了什么问题?它是执行宽字符集中字母表示的问题(毕竟这是什么字符集)?或者这是关于错误使用iostream设施的问题?

回答

1

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

的程序不应该COUT与输出操作上wcout混合输出操作(或与在stdout其他面向宽输出操作):一旦输出操作已经在任进行标准输出流获取只能通过在标准输出上调用freopen才能安全更改的方向(窄或宽)。

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

+0

我居然跑这两种情况分别。为了方便起见,他们被整理在一起。对不起,这不明确。 – goodbyeera

+0

那么你需要为你的应用程序启用Unicode。 对于MSVC,你可以使用_setmode(_fileno(stdout),_O_U16TEXT);在你的主要开始。 但对于MinGW的,这是比较困难的,在这里看到: http://sourceforge.net/apps/trac/mingw-w64/wiki/Unicode%20apps – Eejin

+0

这是否意味着它是更大的问题上了iostream设施但不是希腊字母的执行宽字符集表示? – goodbyeera