UTF-8可以用一个字节或更多字节表示每个字符。我们假设我有以下字节序列:
48 65
我怎么知道它是由48
表示的一个字符和由65
表示的另一个字符,还是由两个字节组合表示的一个字符{{ 1}}?
答案 0 :(得分:2)
UTF-8的设计方式明确无误。 0x48或0x65或0x80以下的任何其他内容都不是多字节序列的一部分。
UTF-8编码代码点的第一个字节的最高有效位将告诉您使用了多少字节。这应该从UTF-8 Bit Distribution Table:
中明确说明Scalar Value First Byte Second Byte Third Byte Fourth Byte
00000000 0xxxxxxx 0xxxxxxx
00000yyy yyxxxxxx 110yyyyy 10xxxxxx
zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx
000uuuuu zzzzyyyy yyxxxxxx 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
所以,最糟糕的情况是你跳到字符串的中间位置并看到一个字节,其最高有效位为1然后是0(从0x80到0xBF的所有内容),这表示它是一个连续字节。在这种情况下,您必须回溯最多3个字节才能确定完整序列。