在字符串中搜索 UTF-8 代码点时有什么注意事项吗?

Zhr*_*hro 2 c++ unicode encoding utf-8 unicode-string

如果我有一些字符串要在 UTF-8 中搜索,另一个要搜索,也在 UTF-8 中搜索,对代码点进行直接比较搜索以查明匹配字符有什么注意事项吗?

以 UTF-8 的工作方式,是否有可能得到误报?

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

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

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

小智 5

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

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

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

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

    • 领先字节,在范围0xC2-0xF4,其编码字符数据的一部分,以及该序列的长度跟随。
    • 范围内的一个或多个连续字节0x80-0xBF,用于对字符的剩余部分进行编码。

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

  • 请记住,UTF 仅对代码点进行编码。如果您想进行*代码点搜索*,没问题。但是,如果您想做“文本搜索”,则必须考虑标准化,因为各种代码点在不同的标准化形式中具有不同的表示形式。因此,您必须确保两个 UTF-8 字符串使用相同的标准化形式。 (2认同)