在字符串中搜索UTF-8代码点时有任何警告吗?

时间:2016-01-19 04:51:21

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

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

通过UTF-8的工作方式,可能会产生误报吗?

我已经阅读了很多关于UTF-8有多棒的文档,但是我在编写回答这个问题的证据方面遇到了麻烦。

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

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

2 个答案:

答案 0 :(得分:4)

不。这里没有任何警告;这种操作在UTF-8中非常安全。

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

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

  • 所有其他字符,由包含以下内容的序列表示:

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

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

答案 1 :(得分:0)

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

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

此外,因为连续字节与每个代码点的初始字节按位有所不同,所以“后退”字样会向后移动。找到初始代码点字节很容易。但是,您建议的反向模式匹配方案也应该没有问题。