每MSDN:爲什麼設置了中文代碼頁的Windows控制檯可以顯示UTF-16編碼字符?
「對於Microsoft C/C++編譯器,源和執行字符集都是ASCII」。
C++ 03
2.1翻譯
」的階段.. 在基本源字符的任何源文件字符集 (2.2)是由取代指定 字符的通用字符名稱()實現可以使用任何內部編碼,很長的 作爲源文件中遇到的實際擴展字符,和 相同的擴展字符在源文件中表示爲 通用字符名稱。使用爲\ uXXXX表示法),被處理 等效。)「
2.13.2字符文字
」通用字符名稱被轉換到編碼,在 執行字符集,這個角色的名字。如果不存在這樣的 編碼,通用字符名稱被轉換爲一個 實現定義的編碼」
爲了測試其執行字符集被用於由MSVC++,我寫以下代碼:
wchar_t *str = L"中";
unsigned char *p = reinterpret_cast<unsigned char*>(str);
for (int i = 0; i < sizeof(L"中"); ++i)
{
printf ("%x ", *(p + i));
}
輸出顯示2d 4e 0 0
和0x4e2d
是這個中國字的UTF-16 encoding所以,我的結論:UTF-16作爲由MSVC(我的版本:2012 4.5.50709)設置執行字符
之後,我嘗試將此字符輸出到Windows控制檯。由於控制檯使用的默認語言環境爲"C"
,因此我將語言環境設置爲代碼頁936,表示簡體中文字符。
// use the execution environment locale setting, which is 936
wchar_t *str = L"中";
char* locale = setlocale(LC_ALL, "");
wprintf (L"%ls\n", str);
,輸出:
中
我很好奇的是,如何在UTF-16編碼字符由Windows控制檯,其區域(解碼器)解碼設爲非UTF-16(MS代碼第936頁)?這怎麼可能發生?
您可以使用調試器並查看內存位置,以確定下面發生了什麼。 – 2013-05-04 09:38:02