2014-02-25 78 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