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("中文") ) 能用麼?linux

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

 由於QT5版本取消了QTextCodec::setCodecForTr()方法。而且你要明白QObject::tr是幹嗎的。它是用於程序國際化使用的,也就能夠界面文字翻譯成不一樣的語言。你若是使用QObject::tr,你應該所有用英文表示,而後後面藉助Linguist翻譯成中文,就不會亂碼了。詳細請搜索「qt國際化"。ui

相關文章
相關標籤/搜索