2013-04-08 42 views
2

代碼:爲什麼wprintf將Unicode連字分隔成兩個不同的字形?

#include <stdio.h> 
#include <wchar.h> 
#define USE_W 
int main() 
{ 
#ifdef USE_W 
    const wchar_t *ae_utf16 = L"\x00E6 & ASCII text ae\n"; 
    wprintf(ae_utf16); 
#else 
    const char *ae_utf8 = "\xC3\xA6 & ASCII text ae\n"; 
    printf(ae_utf8); 
#endif 
    return 0; 
} 

輸出:

AE & ASCII文本AE

雖然printf的產生正確UTF-8輸出:

æ& ASCII文本AE

您可以測試這個here

回答

1

printf只是發送原始字節到您的終端;它不知道編碼的任何內容。如果您的終端恰好配置爲將其解釋爲UTF-8,它將顯示正確的字符。另一方面,

wprintf瞭解編碼。它使用函數wcrtomb,該函數根據當前語言環境將寬字符(wchar_t)編碼爲多字節序列,。如果默認語言環境碰巧是"C",這很簡約,字符æ被轉換爲「或多或少等效」字節序列ae

如果將語言環境明確設置爲使用UTF-8的內容,如"en_US.UTF-8",則輸出is as expected。當然,每個系統支持的語言環境不同,所以對此進行硬編碼並不好。

+0

感謝您使用wprintf之前有關設置語言環境的要求的信息。 – user206334 2013-04-08 10:40:04

+0

這適用於Linux。在Windows上,嘗試將區域設置爲UTF-8代碼頁[將失敗](https://msdn.microsoft.com/zh-cn/library/x99tb11d.aspx)。 AFAICT,'wprintf'不能用來在那裏打印一個UTF-8字符串。 [WriteConsole](https://msdn.microsoft.com/en-us/library/windows/desktop/ms687401(v = vs.85).aspx)是必需的。 – mgiuffrida 2016-12-03 05:24:14

相關問題