【问题标题】:Any caveats when searching for a UTF-8 code point in a string?在字符串中搜索 UTF-8 代码点时有什么注意事项?
【发布时间】:2016-04-24 10:46:13
【问题描述】:

如果我有一些字符串要在 UTF-8 中搜索,而另一个要在 UTF-8 中搜索,是否有任何警告要对代码点进行直接比较搜索以查明匹配字符?

使用 UTF-8 的工作方式,是否有可能出现误报?

我已经阅读了很多关于 UTF-8 有多棒的文档,但我无法形成一个证据来回答这个问题。

如果我向前搜索,那么我可以跳过代码点的长度;但它让我很担心。

与其向后走直到找到代码点的开头,然后从该地址进行内存比较,不如简单地沿着每个字节向后走,直到与搜索字符串完全匹配?

【问题讨论】:

    标签: c++ unicode encoding utf-8 unicode-string


    【解决方案1】:

    不。这里没有警告;此操作在 UTF-8 中是完全安全的。

    回想一下,UTF-8 使用两种通用形式表示字符:

    • ASCII 字符(U+0000 到 U+007F),它们都使用0x00-0x7F 范围内的单个字节按字面意思表示。

    • 所有其他字符,由一个序列表示,包括:

      • 一个前导字节,在0xC2-0xF4 范围内,它对部分字符数据以及后面的序列长度进行编码。
      • 0x80-0xBF 范围内的一个或多个连续字节,用于对字符剩余部分的一部分进行编码。

    由于前导字节和后续字节之间没有重叠,因此在多字节字符中间意外开始搜索是可以的。您将找不到匹配项,因为您要搜索的字符串不会以连续字节开头,但您也不会发现任何误报。

    【讨论】:

    • 请记住,UTF 仅对代码点进行编码。如果你想做一个codepoint search,你没问题。但是,如果您想进行文本搜索,则必须考虑规范化,因为不同的代码点在不同的规范化形式中具有不同的表示。因此,您必须确保两个 UTF-8 字符串使用相同的规范化形式。
    【解决方案2】:

    实际上可以从代码点的第一个字节推断其字节大小,因此您可以像这样向前跳过。但是,您的直接模式匹配方法也应该可以正常工作,因为连续字节与初始代码点字节按位不同。

    有关位模式,请参见此处: https://en.wikipedia.org/wiki/UTF-8#Description

    此外,由于连续字节与每个代码点的初始字节按位不同,因此“返回”查找初始代码点字节很容易。但是,您提出的反向模式匹配方案也应该没有问题。

    【讨论】:

      猜你喜欢
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 2018-12-02
      相关资源
      最近更新 更多