關於Qt亂碼的解釋和解決方案

2021-10-04 10:59:00 字數 2366 閱讀 9667

先給出亂碼的解決方案:

若是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...