2013-05-06 95 views
0

我有此代碼以打印UTF-8字符到窗口控制檯:輸出UTF-8到控制檯

SetConsoleOutputCP(65001); 
freopen(NULL, "w,ccs=UTF-8", stdout); 

wchar_t u16 = 0x00A9; 
unsigned char utf8_b[] = {0xc2, 0xa9, 0x0}; //same as using WideCharToMultibyte for u16 
printf("%s", utf8_b); //(1) 
wprintf(L"%c", u16); //(2) 

(1)產生正確的輸出是 '©',而(2)的輸出是替換字符U + FFFD。我嘗試將stdout(2)重定向到文件以查看編碼轉換是否存在問題,但是它產生與utf8_b []相同的字節序列。

任何人都可以向我解釋爲什麼?這是一個Windows問題?

順便說一句,我的控制檯字體已設置爲Consolas。我在使用(2)之前評論(1),所以我認爲它在這裏與流方向無關。 我讀過某些地方,Windows代碼頁65001中的某些實現錯誤可能會影響C標準IO。任何人都可以證實這一點嗎?

+0

['putwchar'](http://www.cplusplus.com/reference/cwchar/putwchar/)怎麼辦? – Kninnug 2013-05-06 15:59:07

+0

@Kninnug與(2)=。= – hatsuyuki 2013-05-06 16:35:50

+0

相同的結果對我來說,這完全沒有代價。這是什麼版本的VS? – 2013-05-06 23:05:19

回答

0

在同一個FILE流中混合寬和麪向字節的輸出調用未定義的行爲。您應該嘗試使用printf("%lc", u16);或取消所有以字節爲單位的輸出。