當前位置:
首頁 > 知識 > Qt中文亂碼解決思路

Qt中文亂碼解決思路

最近項目中遇到不少的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中文亂碼解決思路

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

mybatis和Mysql返回插入的主鍵ID
Spring Bean的生命周期(比較詳細)

TAG:程序員小新人學習 |