2014-10-04 68 views
0

我在Windows上使用MinGW GCC編譯器的寬字符串文字遇到了麻煩。寬字符字符串字面值

當我使用wscanf讀取用戶輸入時,wprintf輸出正確的國家字符。

wprintf (L"China - Čína"); // outputs "China - " 

假設wchar_t的被編碼爲UTF-16由默認(是LE或BE?),它是如何當該源爲UTF-8工作:然而寬字符串文字在第一民族性停止輸出文件?我試圖將源碼保存爲UTF-16,但我得到非法字節序列錯誤。

+0

您的源代碼的編碼是不相關的程序所使用的編碼當它運行時。只要編譯器知道它是什麼以便它可以將字符串文本轉換爲運行時字符集,您的源代碼就可以使用任何您想要的編碼。 – Wyzard 2014-10-04 22:02:53

+0

包括'',然後在那裏有'wprintf'這行之前調用'setlocale(LC_ALL,「sk」);'(或''cz「',或者其中任何一種語言」Čína「在)應該正確顯示你放的文字。但是,它沒有。我沒有用倒轉的口音打印「Č」。對不起...... – ThoAppelsin 2014-10-04 22:27:06

+1

用調試器中的內存視圖檢查包含字符串的內存區域。如果它在內存中,那麼它不是編譯器相關的問題。如果它不是編譯器相關的,那麼它可能是一些奇特的運行時庫相關的問題。另一種可能的情況是您的輸出設備(控制檯或控制檯模擬或其他)不支持您要輸出的每個unicode字符,並且行爲與預期的字符不同。 – pasztorpisti 2014-10-04 23:48:56

回答

1

由於@pasztorpisti建議,我試圖使用內存查看器,子字符串Čína存儲爲0C 01 ED 00 6E 00 61 00,這在UTF-16LE中是正確的。

我的控制檯使用CP852作爲默認代碼頁,所以我嘗試了chcp 1200,但它沒有設置! MSDN says它僅適用於託管應用程序 - Microsoft知道如何創建編碼地獄。

這是閱讀非常有用仔細this answer:我以前WriteConsoleW產生的cripled控制檯UTF-16LE輸出:

void putws(const wchar_t* str) { 
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str, wcslen(str), NULL, NULL); 
} 

putws(L"China - Čína"); // outputs "China - Čína"