sas*_*alm 5 c++ qt character-encoding
在我的程序中,我加载用户提供的纯文本文件:
\n\nQFile file(fileName);\nfile.open(QIODevice::ReadOnly);\nQTextStream stream(&file);\nconst QString &text = stream.readAll();\nRun Code Online (Sandbox Code Playgroud)\n\n当文件采用 UTF-8 编码时,此方法工作正常,但某些用户尝试导入 Windows-1252 编码文件,并且文件中包含带有特殊字符的单词(例如“boutonni\xc3\xa8re”中的“\xc3\xa8”) ,这些将显示不正确。
\n\n有没有办法检测编码,或者至少区分 UTF-8(可能没有 BOM)和 Windows-1252,而不要求用户告诉我编码?
\n事实证明,在一般情况下自动检测编码是不可能的。
但是,如果文本不是有效的 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/。