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

Any caveats when searching for a UTF-8 code point in a string?

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

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

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

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

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

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

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

  • ASCII 字符(U+0000 到 U+007F),全部使用 0x00-0x7F.

  • 范围内的单个字节逐字表示
  • 所有其他字符,由一个序列表示,包括:

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

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

实际上可以从第一个字节推导出code-point的byte-size,所以你可以像这样向前跳过。但是,您的直接模式匹配方法也应该可以正常工作,因为连续字节与初始 code-point 字节按位不同。

请参阅此处了解 bit-patterns: https://en.wikipedia.org/wiki/UTF-8#Description

此外,因为连续字节与每个代码点的初始字节按位不同,'walking back' 找到初始 code-point 字节很容易。但是,您提出的反向模式匹配方案也应该没有问题。