在 Qt 中,有没有办法检查字节数组是否是有效的 UTF-8 序列?
似乎QString::fromUtf8()默默地抑制或替换无效序列,而不通知调用者有任何序列。这是来自其文档:
但是,UTF-8 可能会出现无效序列,如果发现任何此类,它们将被替换为一个或多个“替换字符”,或被禁止。
在 Qt 中,有没有办法检查字节数组是否是有效的 UTF-8 序列?
似乎QString::fromUtf8()默默地抑制或替换无效序列,而不通知调用者有任何序列。这是来自其文档:
但是,UTF-8 可能会出现无效序列,如果发现任何此类,它们将被替换为一个或多个“替换字符”,或被禁止。
尝试使用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.";
}
即使文本没有“BOM(字节顺序标记)”(*),Frank OsterfeldConverterState
已经在此报告过的方式也有效。
(*) 与 不同QTextCodec::codecForUtfText()
,它需要文本中的 BOM 才能知道它在 Utf-8 中。