Qt中的中文亂碼

首先來理解兩個編碼集:
1.Unicode統一碼萬國碼單一碼標準萬國碼)是計算機科學領域裏的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更爲簡化地方式來呈現和處理文字。
2.GBK漢字內碼擴展規範K爲漢語拼音 Kuo Zhan(擴展)中“擴”字的聲母。英文全稱Chinese Internal Code Specification。當然GBK是支持英文的。
簡單來說unicode是一個萬國碼,支持幾乎所有編碼向其的轉換。GBK是中文編碼集。unicode支持所有的編碼的轉入與轉出,這種轉換之間需要一定的規則,暫時稱爲映射表,當GBK向unicode轉換時,需要GBK->unicode的映射表,如果映射表出錯,那轉換就會失敗出現亂碼現象。
QT中經常出現的亂碼地方是1.界面中文亂碼、2.文件讀取/寫入亂碼。引起亂碼的原因這個映射表搞錯了。QT中的字符串爲unicode編碼,當然,QT的UI中也是unicode編碼。如果想解決亂碼問題,只需在main函數中加入以下三行代碼:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForLocal(QTextCodec::codecForName("GBK")):

    //.................
    return app.exec
}

只要有以上三行代碼,程序中基本上不會出現亂碼了。但是這三句話是什麼意思呢?
1.QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
這句話代表告訴QT我給你的字符串都是GBK編碼的,這樣QT的字符就自動會按照GBK->unicode的映射表進行轉換,另外你當你輸出字符時QT按照unicode->GBK的映射錶轉換,這樣程序中出現字符串的地方就不會有亂碼了。
如果沒有這句話,程序中的字符就要做如下處理(以界面爲例):
QTextEdit *pEdit = new QTextEdit();
QString str = "中文";
QTextCodec *pCodec = QTextCodec::codecForName("GBK");

//從GBK轉換爲Unicode
str = pCodec->toUnicode(str);
pEdit->setText(str);

str = pEdit->text();
//從Unicode轉換爲GBK
str = pCodec->fromUnicode(str);


2.QTextCodec::setCodecFrTr(QtextCodec::codecForName("GBK"));
這句話代表告訴QT我調用QObject::tr()函數時都是GBK編碼,你需要按照對應的映射表進行轉換。

3.QTextCodec::setCodecForLocal(QTextCodec::codecForName("GBK")):
這句話代表告訴QT我本地的文件都是GBK編碼,你讀取文件時需要按照對應的映射表進行轉換。那下面代碼就會出現亂碼:
//test.txt的第一行內容爲”我是中文"
QFile xFile("test.txt");
QTextStream stream(xFile);
QString str = stream.readLine();
qDebug(str);
因爲QT不知道文件中是什麼編碼,所以就默認爲unicode,所以讀出來的東西就是亂碼,下面代碼就不會有亂碼:
//test.txt的第一行內容爲”我是中文"
QFile xFile("test.txt");
QTextStream stream(xFile);
QTextCodec *pCodec = QTextCodec::codecForName("GBK");
stream.setCodec(pCodec);
QString str = stream.readLine();
qDebug(str);





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章