在Qt中,有没有办法检查字节数组是否是有效的UTF-8序列?
似乎QString::fromUtf8()默默地抑制或替换无效序列,而不通知呼叫者有任何序列。这来自其文档:
然而,无效序列是可能的 UTF-8,如果发现任何此类,它们将被替换为一个或 更多"替换字符"或被压制。
答案 0 :(得分:19)
尝试QTextCodec::toUnicode并传递ConverterState个实例。 ConverterState有invalidChars
之类的成员。它们没有通过doxygen记录,但我认为它们是公共API,因为它们在QTextCodec文档中提到过。
示例代码:
QTextCodec::ConverterState state;
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
const QString text = codec->toUnicode(byteArray.constData(), byteArray.size(), &state);
if (state.invalidChars > 0) {
qDebug() << "Not a valid UTF-8 sequence.";
}
答案 1 :(得分:2)
ConverterState
方式,已由Frank Osterfeld报告here,即使文本没有“BOM(字节顺序标记)”(*),也能正常工作。
(*)与QTextCodec::codecForUtfText()
不同,{{1}}需要文本中的BOM才能知道它在Utf-8中。