最近專案中遇到不少的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支援中文,包括我看的教程書上也是,他甚至告訴我要支援中文必須加入這段 但我想告訴你,這個辦法...