UTF-8:读者如何知道一个字符有多少字节?

Cra*_*hax 6 utf-8

UTF-8可以用一个或多个字节来表示每个字符。假设我有以下字节序列:

48 65
Run Code Online (Sandbox Code Playgroud)

我如何知道它是由 表示的一个字符48和由 表示的另一个字符65,还是由两个字节的组合表示的一个字符48 65

use*_*918 6

UTF-8 的设计方式是明确的。0x48 或 0x65 或 0x80 以下的任何其他值都不是多字节序列的一部分。

UTF-8 编码代码点的第一个字节的最高有效位将告诉您它使用了多少字节。从UTF-8 位分布表中应该可以清楚地看出这一点:

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
Run Code Online (Sandbox Code Playgroud)

因此,最坏的情况是您跳转到字符串中间的某个位置,看到一个字节的最高有效位是 1 然后是 0(从 0x80 到 0xBF 的所有内容),这表明它是一个连续字节。在这种情况下,您必须回溯最多 3 个字节才能确定完整的序列。