将utf-8编码的字符串从字节转换为字符时,计算机如何知道字符的结束位置?

Asc*_*iom 7 string unicode utf-8 character-encoding

给定以UTF-8编码的Unicode字符串,它只是内存中的字节.

如果计算机想要将这些字节转换为相应的Unicode代码点(数字),它怎么知道一个字符的结束位置和另一个字符的开头?一些字符由1个字节表示,其他字符由最多6个字节表示.所以,如果你有

00111101 10111001
Run Code Online (Sandbox Code Playgroud)

这可能代表2个字符,或1.计算机如何确定正确解释它?是否有某种约定我们可以从第一个字节知道当前字符使用了多少字节或什么?

Jon*_*oni 14

多字节序列的第一个字节以前导1位的数量对序列的长度进行编码:

  • 0xxxxxxx 是一个独立的角色;
  • 10xxxxxx 是多字节字符的延续;
  • 110xxxxx 是2字节字符的第一个字节;
  • 1110xxxx 是3字节字符的第一个字节;
  • 11110xxx 是4字节字符的第一个字节.

具有超过4个前导1位的字节不编码UTF-8中的有效字符,因为4字节序列已经覆盖了从U + 0000到U + 10FFFF的整个Unicode范围.

因此,问题中提出的示例有一个ASCII字符和一个连续字节,它不会自己编码字符.