【问题标题】:Check if UTF-8 string is valid in Qt检查 UTF-8 字符串在 Qt 中是否有效
【发布时间】:2013-08-16 03:46:51
【问题描述】:

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

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

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

【问题讨论】:

  • 我怀疑要检查 UTF8 字符串的有效性,您需要使用 Unicode 库。
  • 我找到了这个代码 sn-p: [github.com/JulienPalard/is_utf8].它可能很有用。
  • 链接显示“找不到页面”

标签: c++ qt utf-8


【解决方案1】:

尝试使用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.";
}

【讨论】:

  • 谢谢,这让我找到了正确的方向。事实证明,使用QTextCodec::codecForUtfText() 有一种更简单的方法,如果没有适合文本的 UTF 编码,它允许您指定默认编解码器。我将QTextCodec::codecForLocale() 指定为默认编解码器。
  • 这不像我预期的那样工作。如果 byteArray 中有嵌入的零,则只检查第一个零的有效性。我希望继续验证到最后,为什么要提供大小?我知道我之前可以检查字节数组是否包含 '\0' 但这意味着性能会降低。这应该被视为 Qt 中的错误吗?
  • @Gneuromante:我不这么认为,因为字节值 0 是 UTF-8 编码字符串的空终止符。文档没有说可以将数据解释为一组用 0 终止符分隔的字符串。如果您知道数据可以包含多个字符串,我认为您应该自己将数据拆分为单独的字符串。
【解决方案2】:

ConverterState 方式(已由 Frank Osterfeld 报告 here)即使文本没有“BOM(字节顺序标记)”(*)也有效。

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

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    相关资源
    最近更新 更多