QFile讀取文本文件中文亂碼處理

問題描述:

​ 在使用QFile讀取文本文件時,如果文件內容是GBK(包括gb2313)格式的,則會顯示爲亂碼

解決方式1:

​ 使用QTextStream指明待讀取的文件的編碼格式,如下:

QTextStream in(&file);
in.setCodec("GBK"); // 設置文件的編碼格式爲GBK
QString line = in.readLine(); // 此時以GBK的方式從文件中讀取內容,結果正常

​ 以上方式只適用於待讀取文件編碼格式都相同(如都是GBK)的情況

解決方式2:

​ 使用QTextCodec的轉換接口,參考代碼如下:

while (!file.atEnd())
{
    QByteArray line = file.readLine();

    QTextCodec::ConverterState state;
    QString text = QTextCodec::codecForName("UTF-8")->toUnicode(line.constData(), line.size(), &state);
    if (state.invalidChars > 0)
    {
        text = QTextCodec::codecForName("GBK")->toUnicode(line);
    }
    
    ui->listWidget->addItem(text);
}

​ 也可封裝成一個函數,直接調用,如下:

QString MusicPlayerDialog::byteArrayToUnicode(const QByteArray &array)
{
    // state用於保存轉換狀態,它的成員invalidChars,可用來判斷是否轉換成功
    // 如果轉換成功,則值爲0,如果值大於0,則說明轉換失敗
    QTextCodec::ConverterState state;
    // 先嚐試使用utf-8的方式把QByteArray轉換成QString
    QString text = QTextCodec::codecForName("UTF-8")->toUnicode(array.constData(), array.size(), &state);
    // 如果轉換時無效字符數量大於0,說明編碼格式不對
    if (state.invalidChars > 0)
    {
        // 再嘗試使用GBK的方式進行轉換,一般就能轉換正確(當然也可能是其它格式,但比較少見了)
        text = QTextCodec::codecForName("GBK")->toUnicode(array);
    }
    return text;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章