在我的程序中,我加载了用户提供的纯文本文件:
QFile file(fileName);
file.open(QIODevice::ReadOnly);
QTextStream stream(&file);
const QString &text = stream.readAll();
当文件是UTF-8编码时,这可以正常工作,但有些用户尝试导入Windows-1252编码文件,如果他们有特殊字符的单词(例如“boutonnière”中的“è”),那些将显示不正确。
有没有办法检测编码,或至少区分UTF-8(可能没有BOM)和Windows-1252,而不要求用户告诉我编码?
答案 0 :(得分:4)
事实证明,一般情况下无法自动检测编码。
但是,如果文本无效UTF-8 / UTF-16 / UTF-32文本,则有一种解决方法至少可以回退到系统区域设置。它使用QTextCodec::codecForUtfText()
,尝试使用UTF-8,UTF-16和UTF-32解码字节数组,并在失败时返回提供的默认编解码器。
执行此操作的代码:
QTextCodec *codec = QTextCodec::codecForUtfText(byteArray, QTextCodec::codecForName("System"));
const QString &text = codec->toUnicode(byteArray);
<强>更新强>
上面的代码不会检测没有BOM的UTF-8,因为codecForUtfText()依赖于BOM标记。要检测没有BOM的UTF-8,请参阅https://stackoverflow.com/a/18228382/492336。
答案 1 :(得分:3)
至少到目前为止,这个技巧对我有用。此方法不需要BOM工作:
QTextCodec::ConverterState state;
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
const QByteArray data(readSource());
const QString text = codec->toUnicode(data.constData(), data.size(), &state);
if (state.invalidChars > 0)
{
// Not a UTF-8 text - using system default locale
QTextCodec * codec = QTextCodec::codecForLocale();
if (!codec)
return;
ui->textBrowser->setPlainText(codec->toUnicode(readSource()));
}
else
{
ui->textBrowser->setPlainText(text);
}