本文借用Qt的解码工具,尝试解析常见的几种文本文件编码格式。防止按照错误的编码格式读取文件,造成乱码。
QFile f(path);
if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) {
return false;
}
QByteArray rawData = f.readAll();
// 常见候选编码列表(按优先级排序)
const QList<QByteArray> candidateEncodings = {
"UTF-8",
"GB2312", // 简体中文
"Big5", // 繁体中文
"Shift-JIS", // 日文
"Windows-1252", // 拉丁文
"ISO-8859-1" // 西欧
};
// 尝试用每个编码解码,寻找无错误的编码
QString parsedText;
for (const QByteArray& encoding : candidateEncodings) {
parsedText.clear();
QTextCodec* codec = QTextCodec::codecForName(encoding);
if (!codec) continue;
QTextCodec::ConverterState state;
QString convText = codec->toUnicode(rawData.data(), rawData.length(), &state);
// 如果没有无效字符且解码后的文本非空,则认为有效
if (state.invalidChars == 0 && !convText.isEmpty()) {
parsedText = convText;
break;
}
}
if (parsedText.isEmpty()) {
// 若没有解码成功,则默认按照Local8Bit方式读取
parsedText = QString::fromLocal8Bit(rawData);
}
// parsedText为转换结果
qDebug() << parsedText
c.close();