最近專案中遇到不少的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國際化"。
freemarker 中文亂碼問題解決辦法
解決辦法一 通過修改配置檔案freemarker.properties,修改預設編碼 locale zh cn default encoding gbk number format date format yyyy mm dd time format hh mm ss datetime format...
Rails 中文編碼亂碼問題解決辦法
中文亂碼永遠是心頭一痛。最近學習rails,又遇到了久違的中文亂碼問題。如下是本人的解決方法 編碼選擇 除非因為歷史遺留原因,要保證所有的編碼全部為utf 8,盡量不要嘗試gbk編碼,否則以後出現問題的時候,會有你好看的。編輯器編碼 將ruby原始檔盡量使用utf 8編碼,這個在一些高階的文字編輯器...
php 亂碼 問題解決辦法
php亂碼問題解決辦法 必須使使用的 資料庫 文字編輯 瀏覽器 資料獲取 編碼格式一致。如設定成 utf 8的方法為 1.資料庫建立時設定 字符集為utf 8 2.在專案屬性 或檔案屬性 文字檔案編碼處設定成utf 8 如果沒用ide工具編寫,可以不設定此項 3.設定網頁顯示編碼格式 header ...