(轉)VS2015 & Qt中文編碼方式

編程之法

Linux下中文編碼方式很好解決,統一用UTF-8就沒問題了,然而在Windows下這個簡單的問題會有很多坑……爲了在VS中讓Qt正確顯示中文,折騰了好久終於嘗試出一個可用的方法,記錄如下。

Linux和Qt內部都是使用UTF-8處理字符的,故考慮到跨平臺的需求,將源代碼保存爲UTF-8格式兼容性最好。然而如果使用不帶簽名的UTF-8格式(即Unicode(UTF-8 無簽名) - 代碼頁 65001)保存的話,在程序中存在奇數個字符的中文字符串時,無法正常編譯,此時會出現error C2001:常量中有換行符。關於這個問題可參考:

Visual Studio error C2001:常量中有換行符(解決辦法)

結論就是不要使用無簽名的UTF-8編碼源文件,無比的坑啊……另一篇文章中比較了各種編碼格式的兼容性:

[C/C++] 各種C/C++編譯器對UTF-8源碼文件的兼容性測試(VC、GCC、BCB)

結論是使用帶簽名的UTF-8格式(即Unicode(UTF-8 帶簽名) - 代碼頁 65001)是兼容性最好的選擇。選擇了這種編碼方式後可以正常編譯含有中文字符串的源文件了,不過要是不做任何設置的話,此時在Qt中顯示出來的效果會是亂碼。

爲了正確顯示中文,需要在使用到中文的源文件頭部加上這樣一句預編譯指令:

1
#pragma execution_character_set("utf-8")

這條預編譯指令的作用是指定字符串的輸出編碼方式爲UTF-8,注意,這與文件本身的編碼方式沒有關係。詳細說明可參考MSDN:

execution_character_set

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編碼方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章