1. 程式人生 > >Qt中的中文亂碼

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);