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

问题描述 投票:0回答:2

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

按照 UTF-8 的工作方式,有可能出现误报吗?

我读过很多关于 UTF-8 有多棒的文档,但我很难形成回答这个问题的证据。

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

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

c++ unicode encoding utf-8 unicode-string
2个回答
7
投票

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

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

  • ASCII 字符(U+0000 到 U+007F),均使用

    0x00-0x7F
    范围内的单个字节字面表示。

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

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

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


0
投票

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

请参阅此处的位模式: https://en.wikipedia.org/wiki/UTF-8#Description

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

© www.soinside.com 2019 - 2024. All rights reserved.