16

在 Qt 中,有没有办法检查字节数组是否是有效的 UTF-8 序列?

似乎QString::fromUtf8()默默地抑制或替换无效序列,而不通知调用者有任何序列。这是来自其文档:

但是,UTF-8 可能会出现无效序列,如果发现任何此类,它们将被替换为一个或多个“替换字符”,或被禁止。

4

2 回答 2

20

尝试使用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.";
}
于 2013-08-14T09:46:55.850 回答
2

即使文本没有“BOM(字节顺序标记)”(*),Frank OsterfeldConverterState已经在报告过的方式也有效。

(*) 与 不同QTextCodec::codecForUtfText(),它需要文本中的 BOM 才能知道它在 Utf-8 中。

于 2013-12-09T00:09:50.830 回答