這裡涉及到一個字元在原始碼(文字)中,編譯好的二進位制檔案中,以及最後控制檯輸出編碼形式的區別.
首先,要明確一點:C(語言/程式)並不理解ANSI,UTF-8以及任何其他編碼.它只知道處理你給它的字元的二進位制表示.
在簡體中文Windows下,預設的文字儲存編碼是ANSI(即GBK);Linux下根據系統locale設定,一般應該是(zh_CN.UTF-8).(以下基於簡體中文Windows)
1)對於原始檔中儲存的"中文"這個字串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(預設ANSI編碼得到).但編譯器才不管是不是GBK神馬的,它就管那串數字.
區別,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc預設UTF-8).注意,用MinGW編譯的原始檔中有中文寬字元必須儲存為UTF-8編碼.
2)然後,在二進位制檔案中的儲存形式,對傳統的字串(char str[] = "中文";),編譯器什麼都不做,直接把那串數字(如"0xd6d0","0xcec4")搬過去塞進二進位制檔案.
但對於寬字串(wchar_t wstr[] = L"中文";),編譯器會將其做轉換,轉換成Unicode編碼格式(在Windows是UTF-16,而Linux下是UTF-32).如"中文"的16位Unicode是"0x4e2d"和"0x6587",然後把這串轉換後的數字("0x4e2d","0x6587")塞進二進位制檔案中.(這裡VS和MinGW做的沒有區別)
這裡有點需要注意,編譯器必須知道你的原始檔儲存的編碼!如VS預設是ANSI編碼,如果你用UTF-8儲存.c原始檔去用VS開啟看一定是亂碼.同理如果你用mingw編譯ANSI編碼儲存的原始檔,也會出錯!(但可以修改編譯選項解決,見文章末尾) 在本文這裡這個原因其實很好理解,因為編譯器需要知道,如果它要將一個儲存在檔案中的字元轉成寬字元時,是從什麼編碼轉到Unicode.(可見上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)
這裡涉及到一個字元在原始碼(文字)中,編譯好的二進位制檔案中,以及最後控制檯輸出編碼形式的區別.
首先,要明確一點:C(語言/程式)並不理解ANSI,UTF-8以及任何其他編碼.它只知道處理你給它的字元的二進位制表示.
在簡體中文Windows下,預設的文字儲存編碼是ANSI(即GBK);Linux下根據系統locale設定,一般應該是(zh_CN.UTF-8).(以下基於簡體中文Windows)
1)對於原始檔中儲存的"中文"這個字串,VS2008看到的就是"0xd6d0"和"0xcec4"的形式(預設ANSI編碼得到).但編譯器才不管是不是GBK神馬的,它就管那串數字.
區別,MinGW看到的是"0xe4b8ad"和"0xe69687"(gcc預設UTF-8).注意,用MinGW編譯的原始檔中有中文寬字元必須儲存為UTF-8編碼.
2)然後,在二進位制檔案中的儲存形式,對傳統的字串(char str[] = "中文";),編譯器什麼都不做,直接把那串數字(如"0xd6d0","0xcec4")搬過去塞進二進位制檔案.
但對於寬字串(wchar_t wstr[] = L"中文";),編譯器會將其做轉換,轉換成Unicode編碼格式(在Windows是UTF-16,而Linux下是UTF-32).如"中文"的16位Unicode是"0x4e2d"和"0x6587",然後把這串轉換後的數字("0x4e2d","0x6587")塞進二進位制檔案中.(這裡VS和MinGW做的沒有區別)
這裡有點需要注意,編譯器必須知道你的原始檔儲存的編碼!如VS預設是ANSI編碼,如果你用UTF-8儲存.c原始檔去用VS開啟看一定是亂碼.同理如果你用mingw編譯ANSI編碼儲存的原始檔,也會出錯!(但可以修改編譯選項解決,見文章末尾) 在本文這裡這個原因其實很好理解,因為編譯器需要知道,如果它要將一個儲存在檔案中的字元轉成寬字元時,是從什麼編碼轉到Unicode.(可見上述VS是GBK->Unicode,而MinGW是UTF-8->Unicode)