检查Qt中的UTF-8字符串是否有效

时间:2013-08-14 09:10:52

标签: c++ qt utf-8

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

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

  

然而,无效序列是可能的   UTF-8,如果发现任何此类,它们将被替换为一个或   更多"替换字符"或被压制。

2 个答案:

答案 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中。