Qt中文亂碼解決思路

2021-08-22 13:29:23 字數 2891 閱讀 4016

最近專案中遇到不少的qt中文亂碼的問題,主要原因是客戶的需求比較多,qt版本有用4的版本的也有用5的版本,並且還有windows與linux跨平台的需求。

經常出現個問題是windows的解決了,源**放到linux上編譯不通過或者中文會亂碼,本文主要是得出乙個解決方案能解決qt的中文問題,並支援不同平台與不同版本。

下面我們通過下列場景中的問題來找尋答案:場景1:qt版本: qt5.1.0_vs2012

作業系統: win7

cpp檔案編碼: utf8—無bom格式

cpp部分**如下:

qtextcodec::setcodecforlocale(qtextcodec::codecforname("utf8"));

qstring strmessage = qstring::fromlocal8bit("我是utf8編碼的檔案:"));

qdebug() << strmessage;

試著編譯下你會發現編譯出錯:error c2001: newline in constant

為什麼呢?因為utf8分為utf8-無bom和utf8-bom

utf8-bom其實就是比utf8-無bom多了幾個位元組的檔案頭,用於和utf-16與utf-32區分的。

而:windows識別的utf8是指utf-bom(你可以使用記事本另存為utf8格式後檢視)。

因為有中文冒號:的存在故此utf8-無bom檔案格式使用vs的cl編譯器是無法識別為utf8的格式,只能當成ansi來讀取解析編譯,故編譯出錯。

那就有人會說那我就把cpp的檔案格式改為:utf8—bom格式。好,我們來看下個場景

場景2:
cpp檔案編碼:  utf8—bom格式

cpp部分**如下:

qtextcodec::setcodecforlocale(qtextcodec::codecforname("utf8"));

qstring strmessage = qstring::fromlocal8bit("我是utf8編碼的檔案:"));

qdebug() << strmessage;

編譯通過,執行你會發現出現了乙個問題,那就是中文亂碼了,輸出了一堆無用的資訊。

這又是什麼問題呢?

其實是qt的qtextcodec::codecforname("utf8")這句**導致的。

注:qt認為的utf8預設為:utf8-無bom。

故就成了把utf8-bom格式的cpp檔案認為是utf8-無bom格式去解析,那結果顯而易見肯定會出錯。

場景3:
cpp檔案編碼:  utf8—bom格式

cpp部分**如下:

// qtextcodec::setcodecforlocale(qtextcodec::codecforname("utf8")); 刪掉此行

qstring strmessage = qstring::fromlocal8bit("我是utf8編碼的檔案:"));

qdebug() << strmessage;

or

qtextcodec::setcodecforlocale(qtextcodec::codecforname("gbk")); // 改為gbk編碼

qstring strmessage = qstring::fromlocal8bit("我是utf8編碼的檔案:"));

qdebug() << strmessage;

編譯通過,並且輸出的中文也是正確無亂碼。
場景4:
cpp檔案編碼:  gbk編碼

cpp部分**如下:

// qtextcodec::setcodecforlocale(qtextcodec::codecforname("utf8")); 刪掉此行

qstring strmessage = qstring::fromlocal8bit("我是utf8編碼的檔案:"));

qdebug() << strmessage;

or

qtextcodec::setcodecforlocale(qtextcodec::codecforname("gbk")); // 改為gbk編碼

qstring strmessage = qstring::fromlocal8bit("我是utf8編碼的檔案:"));

qdebug() << strmessage;

編譯通過,並且輸出的中文也是正確無亂碼。
總結:

(1)、中文編碼一律使用qstring::fromlocal8bit()介面。

原因:需要支援qt4版本。qstringliteral()方法也可取,但是它只支援qt5版本,如果沒有版本問題,可以使用。

(2)、cpp等檔案編碼一律使用utf8—bom

格式。原因1:utf8-無bom在使用window編譯器cl中編譯會失敗,當然除非你windows中使用qt的mingw版本編譯開發。

原因2:不使用gbk的檔案編碼是為了更容易的相容到linux版本與windows中,否則你需要改qtcreate的編碼環境與linux的系統字元環境。

其它知識:qstring str( qobject::tr("中文") ) 能用麼?

答案:不能,tr( ) 中只能是英文。

因為qt5版本取消了qtextcodec::setcodecfortr()方法。並且你要明白qobject::tr是幹嘛的。它是用於程式國際化使用的,也就可以介面文字翻譯成不同的語言。你如果使用qobject::tr,你應該全部用英文表示,然後後面借助linguist翻譯成中文,就不會亂碼了。詳細請搜尋「qt國際化"。

Qt中文亂碼解決思路

最近專案中遇到不少的qt中文亂碼的問題,主要原因是客戶的需求比較多,qt版本有用4的版本的也有用5的版本,並且還有windows與linux跨平台的需求。經常出現個問題是windows的解決了,源 放到linux上編譯不通過或者中文會亂碼,本文主要是得出乙個解決方案能解決qt的中文問題,並支援不同平...

qt中文亂碼解決

臺機上的工程移到筆記本上中文亂碼了,臺機上用的 qtextcodec codecforname gbk 筆記本上不管用gbk還是utf 8都不管用,網上的方法試了也沒用,最後在qt assistance裡找到了qtextcodec codecforlocale 問題解決。qtextcodec cod...

Qt 解決中文亂碼問題

也許你在用這個方法實現中文化,但它確實不夠嚴謹 laguage c title 出現頻率最高的辦法 include int main int argc,char argv 很多地方都會告訴你,這樣可以實現qt支援中文,包括我看的教程書上也是,他甚至告訴我要支援中文必須加入這段 但我想告訴你,這個辦法...