Linux下中文編碼方式很好解決,統一用UTF-8
就沒問題了,然而在Windows下這個簡單的問題會有很多坑……爲了在VS中讓Qt正確顯示中文,折騰了好久終於嘗試出一個可用的方法,記錄如下。
Linux和Qt內部都是使用UTF-8
處理字符的,故考慮到跨平臺的需求,將源代碼保存爲UTF-8
格式兼容性最好。然而如果使用不帶簽名的UTF-8
格式(即Unicode(UTF-8 無簽名) - 代碼頁 65001)保存的話,在程序中存在奇數個字符的中文字符串時,無法正常編譯,此時會出現error C2001:常量中有換行符
。關於這個問題可參考:
結論就是不要使用無簽名的UTF-8
編碼源文件,無比的坑啊……另一篇文章中比較了各種編碼格式的兼容性:
結論是使用帶簽名的UTF-8
格式(即Unicode(UTF-8 帶簽名) - 代碼頁 65001)是兼容性最好的選擇。選擇了這種編碼方式後可以正常編譯含有中文字符串的源文件了,不過要是不做任何設置的話,此時在Qt中顯示出來的效果會是亂碼。
爲了正確顯示中文,需要在使用到中文的源文件頭部加上這樣一句預編譯指令:
1 |
#pragma execution_character_set("utf-8") |
這條預編譯指令的作用是指定字符串的輸出編碼方式爲UTF-8
,注意,這與文件本身的編碼方式沒有關係。詳細說明可參考MSDN:
MSDN中還提到,這條指令已經要過時了,需要使用新方法來替代,不過目前還能使用,就不再折騰了……這條指令也是VS下特有的,GCC沒有也不需要這個設置,故加上條件編譯來保證跨平臺移植的兼容性:
1 2 3 |
#ifdef _MSC_VER #pragma execution_character_set("utf-8") #endif |
這樣設置後,Qt中就可以正確顯示中文了。需要注意的是,其實並沒有必要使用QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"))
來指定Qt的編碼方式,因爲默認情況下使用的就是UTF-8
編碼方式。