检测文本文件编码

sas*_*alm 5 c++ qt character-encoding

在我的程序中,我加载用户提供的纯文本文件:

\n\n
QFile file(fileName);\nfile.open(QIODevice::ReadOnly);\nQTextStream stream(&file);\nconst QString &text = stream.readAll();\n
Run Code Online (Sandbox Code Playgroud)\n\n

当文件采用 UTF-8 编码时,此方法工作正常,但某些用户尝试导入 Windows-1252 编码文件,并且文件中包含带有特殊字符的单词(例如“boutonni\xc3\xa8re”中的“\xc3\xa8”) ,这些将显示不正确。

\n\n

有没有办法检测编码,或者至少区分 UTF-8(可能没有 BOM)和 Windows-1252,而不要求用户告诉我编码?

\n

sas*_*alm 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);
Run Code Online (Sandbox Code Playgroud)

更新

但是,上面的代码不会检测没有 BOM 的 UTF-8,因为 codecForUtfText() 依赖于 BOM 标记。要检测不带 BOM 的 UTF-8,请参阅/sf/answers/1275986771/