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

String 当将utf-8编码的字符串从字节转换为字符时,计算机如何知道字符的结尾?,string,unicode,utf-8,character-encoding,String,Unicode,Utf 8,Character Encoding,给定一个以UTF-8编码的Unicode字符串,它只是内存中的字节 如果计算机想将这些字节转换为相应的Unicode码点(数字),它如何知道一个字符的结束和另一个字符的开始?某些字符由1字节表示,其他字符最多由6字节表示。所以如果你有 00111101 10111001 这可能代表2个字符,或1个字符。计算机是如何决定正确解释它的?是否存在某种约定,从第一个字节我们可以知道当前字符使用了多少字节或其他什么?多字节序列的第一个字节以前导1位的数量对序列的长度进行编码: 0xxxxxxx本身就是

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

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

00111101 10111001

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

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

  • 0xxxxxxx
    本身就是一个字符
  • 10xxxxxx
    是多字节字符的延续
  • 110xxxxx
    是2字节字符的第一个字节
  • 1110xxxx
    是3字节字符的第一个字节
  • 11110xxx
    是4字节字符的第一个字节
超过4个前导1位的字节不能在UTF-8中编码有效字符,因为4字节序列已经覆盖了从U+0000到U+10FFFF的整个Unicode范围


因此,问题中提出的示例有一个ASCII字符和一个连续字节,它们本身不编码字符。

10年前UTF-8被限制为4个字节,您可能使用了一些过时的源代码。无论如何,这个方案解释得很好。这是一个古老的来源,但这并没有真正改变问题:)你有一个观点,维基百科很清楚