Qt 5 中解決中文亂碼的方法
在 Qt 4 的時代,解決中文亂碼挺麻煩。要考慮用的是什么編譯器,具體的可以參考下面這篇文章:
http://blog.csdn.net/brave_heart_lxl/article/details/7186631
到了 Qt 5 的年代,這個問題變得簡單了些。因為根據 Qt 的文檔:
http://doc.qt.io/qt-5.6/qstring.html#QString-7
中規定 QString 的 const char* 構造函數是調用 fromUtf8() 構造的。所以要求字符串字面量是 UTF-8 編碼的字節。
這里先要解釋一下下面兩個概念:
- 源碼字符集(the source character set):源碼文件是使用何種編碼保存的
- 執行字符集(the execution character set):可執行程序內保存的是何種編碼(程序執行時內存中字符串編碼)
源碼字符集很容易理解,就是我們源代碼的編碼。為了我們的代碼能夠跨平台,源文件要保存為帶 BOM 的 utf-8。
執行字符集就麻煩多了。比如我們下面的代碼片段:
QString str("我是中文");
即使這個文件存為 utf-8 格式了,編譯成 exe 文件時,編譯器也可能對這個字符串常量進行轉碼,轉為別的編碼格式。
在 gcc 中,控制這個轉碼操作的命令行參數是:
-fexec-charset=charset
如果不指定的話默認是 utf-8。所以我們用 gcc 時很少關注這個問題。
Viual Stdio 中就麻煩多了。這里先說 Visual stdio 2015,這個是我現在用的編譯環境。VS2015 中如果源代碼是 utf-8的,執行字符集默認是本地 Locale 字符集,對於簡體中文的 windows 系統來說,這個 本地Locale字符集是 gb18030。所以直接顯示漢字會全是亂碼。解決這個亂碼有三個辦法,第一個辦法是編譯時加入命令行參數,在 Qt 的 pro 文件中可以這樣:
msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8
第二個辦法是在源文件中加入:
#pragma execution_character_set("utf-8")
更好的辦法是源代碼寫為:
QString str(u8"我是中文");
當然,這里要求編譯器支持 C++11,因此上面的代碼在 VS2005、VS2008 上是無法編譯通過的。
另外,如果源代碼保存為不帶 BOM 的 utf-8。那需要告訴 VS2015 我們的編碼格式是 utf-8,可以在 pro 文件中加入如下的代碼:
msvc:QMAKE_CXXFLAGS += -source-charset:utf-8
另外再說說 VS2005、VS2008 下該如何設置。首先這兩個編譯器都不支持 C++11,也不支持執行字符集的設置,執行字符集就是默認的本地 Locale 字符集。所以我們的代碼只能寫為:
QString str = QString::fromLocal8Bit("我是中文");
轉載來源:https://blog.csdn.net/liyuanbhu/article/details/72596952