問題描述:
在使用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;
}