Qt 5 中解決中文亂碼的方法


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM