先給出亂碼的解決方案:
若是qt5,則在pro檔案中加入下面這段**:
greaterthan(qt_major_version, 4):
若是qt4,則在main.cpp中加入下面這段**:
#if (qt_version <= qt_version_check(5,0,0))
#ifdef q_os_linux
qtextcodec *codec = qtextcodec::codecforname("utf-8");
#elif defined (q_os_win)
qtextcodec *codec = qtextcodec::codecforname("gb2312");
#endif
qtextcodec::setcodecforlocale(codec);
qtextcodec::setcodecforcstrings(codec);
qtextcodec::setcodecfortr(codec);
#endif
關於qt的亂碼問題,以下是個人見解,可能有錯誤之處,歡迎指出。
要弄清楚qt中的亂碼問題,首先需要清除2個概念:
原始碼字符集(the source character set):原始碼檔案是使用何種編碼儲存的
執行字符集(the execution character set):可執行程式內儲存的是何種編碼(程式執行時記憶體中字串編碼)
qt為了保證跨平台,原始碼字符集統一採用的是帶 bom 的 utf-8格式,而在不同的系統上執行字符集的是不同的,windows 一般用的gbk(gb2312),linux一般用的是不帶bom的utf-8。
所以在windows系統下qt5環境中,解決亂碼的辦法有pro檔案中加
qmake_cxxflags += -execution-charset:utf-8
或者在每個原始檔的最上方加:
#pragma execution_character_set("utf-8")
這兩者的原理都是將windows下的執行編碼變成帶bom的utf-8格式,這樣就和原始碼字符集一致,解決了亂碼問題,這個方法在linux系統下也可以解決亂碼問題,原理也是一致的。
但是在qt4的環境下,上面2中方案的**都是不識別的,所以在qt4的環境下需要按以下方式解決亂碼問題:
若是在windows系統下:
qtextcodec::setcodecforcstrings(qtextcodec::codecforname("gb2312"));
原理是將windows系統下qstring中的中文字元用gb2312的編碼儲存,即將原始碼字符集變成gb2312的格式,這樣原始碼字符集也和執行字符集一致了,都變成了gb2312。
若在linux系統下:
qtextcodec::setcodecforcstrings(qtextcodec::codecforname("utf-8"));
linux下產生亂碼的原因是原始碼字符集是帶bom的utf-8格式,而執行字符集是不帶bom的uft-8格式,這2種格式也是有區別的,同樣會導致亂碼。所以上面這句的原理是將qstring儲存的中文字元的原始碼字符集變成不帶bom的uft-8格式,這樣原始碼字符集也和執行字符集一致了,都變成了不帶bom的uft-8格式。注意與上面的#pragma execution_character_set("utf-8")進行區別。
有一種萬能的解決亂碼的方式,那就是用qstring::fromlocal8bit函式,原理是qstring全部以qtextcodec::setcodecforlocale函式指定的編碼將字串轉成unicode,在執行時再轉成對應的執行編碼,自然可以保持兩者一致,解決亂碼問題。若沒有顯示指定qtextcodec::setcodecforlocale,則windows下是gb2312,linux下是utf-8。但是若主函式中用qtextcodec::setcodecforlocale(codec)指定的編碼不對,在讀取第三方輸入的時候(如qprocess讀取控制台訊息),qstring::fromlocal8bit一樣會導致亂碼,例如:
在windows系統下,首先指定qtextcodec::setcodecforlocale("utf-8"),
之後用qprocess讀取控制台訊息:
qstring outputstr = qstring::fromlocal8bit(process.readallstandardoutput());
由於windows上控制台的編碼是gb2312,而這個時候qt認為是utf-8,自然導致了亂碼,這個時候可以用如下方式解決:
qstring outputstr = qtextcodec::codecforname("gb2312")->tounicode(
process.readallstandardoutput());
即直接說明當前的字段是gb2312編碼即可。
QT各種亂碼解決方案
qt中的中文顯示,經常會出現亂碼,但在ui設計介面上新增的中文是不會出現亂碼的,如果你剛使用qt,那麼你肯定會碰到這個問題。網上搜尋一下,找到的都是這種 include qtextcodec int main int argc,char argv qt5中,一些函式已經被取消了,而且網上很多都是不推...
QT 中文亂碼的解決方案
qt creator 低版本中文亂碼的解決方案 qt 5.9版本的有個很煩人的問題,就是新建的cpp檔案格式是utf8的,但是編譯又不按utf8去讀檔案,導致中文亂碼 後面在網上一查,原來是msvc編譯器導致的問題,如果是mingw編譯器不存在這個問題 解決方案就是在pro檔案上加上這個 msvcq...
Qt中文亂碼問題解決方案
注意 qt的4.8版預設的不是utf 8,所以可能會出現中文亂碼。1.匯入字元編碼標頭檔案 qtextcodec 2.在main函式中 建立乙個字元編碼物件 qtextcodec codec qtextcodec codecforname utf 8 告訴qt當前系統所使用的字元編碼 qtextco...