如果我有一些要在UTF-8中搜索的字符串和另一个要搜索的字符串,也是在UTF-8中,是否有任何警告要对代码点进行直接比较搜索以找出匹配的字符?
通过UTF-8的工作方式,可能会产生误报吗?
我已经阅读了很多关于UTF-8有多棒的文档,但是我在编写回答这个问题的证据方面遇到了麻烦。
如果我向前搜索,那么我可以跳过代码点的长度;但它反过来走了一条让我担心的绳子。
在我点击代码点的开始然后从该地址进行内存比较之前,不是向后走,而是简单地沿着每个字节向后走,直到我得到与搜索字符串的完全匹配,这是安全的吗?
答案 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
此外,因为连续字节与每个代码点的初始字节按位有所不同,所以“后退”字样会向后移动。找到初始代码点字节很容易。但是,您建议的反向模式匹配方案也应该没有问题。