Unicode UTF-8编码如何识别单字节和双字节字符?

Unicode UTF-8编码如何识别单字节和双字节字符?,unicode,encoding,utf-8,character-encoding,Unicode,Encoding,Utf 8,Character Encoding,最近我遇到了一个关于字符编码的问题,当我深入研究字符集和字符编码时,我想到了这个疑问。UTF-8编码最受欢迎,因为它与ASCII向后兼容。因为UTF-8是可变长度编码格式,它如何区分单字节字符和双字节字符。例如,“Aݔ”存储为“410754”(A的Unicode为41,阿拉伯字符的Unicode为0754。编码如何识别41是一个字符,0754是另一个双字节字符?为什么它不被视为4107是一个双字节字符,54是一个单字节字符 例如,“Aݔ”存储为“410754” UTF-8不是这样工作的 字符U+

最近我遇到了一个关于字符编码的问题,当我深入研究字符集和字符编码时,我想到了这个疑问。UTF-8编码最受欢迎,因为它与ASCII向后兼容。因为UTF-8是可变长度编码格式,它如何区分单字节字符和双字节字符。例如,“Aݔ”存储为“410754”(A的Unicode为41,阿拉伯字符的Unicode为0754。编码如何识别41是一个字符,0754是另一个双字节字符?为什么它不被视为4107是一个双字节字符,54是一个单字节字符

例如,“Aݔ”存储为“410754”

UTF-8不是这样工作的

字符U+0000到U+007F(又称ASCII)以单字节的形式存储。它们是唯一代码点在数字上与UTF-8表示形式匹配的字符。例如,U+0041变为二进制的
0x41
,即
01000001

所有其他字符都用多个字节表示。U+0080到U+07FF各使用两个字节,U+0800到U+FFFF各使用三个字节,U+10000到U+10FFFF各使用四个字节

计算机知道一个字符的结束位置和下一个字符的开始位置,因为UTF-8的设计使ASCII使用的单字节值不会与多字节序列中使用的值重叠。字节
0x00
0x7F
仅用于ASCII,其他不用于;上面的字节
0x7F
仅用于多字节序列-此外,在多字节序列开头使用的字节也不能出现在这些序列中的任何其他位置

因为代码点需要被编码。考虑下面的二进制模式:

  • 2字节:
    110xxxxx 10xxxxxx
  • 3字节:
    1110xxxx 10xxxxx 10xxxxxx
  • 4个字节:
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
第一个字节中的“1”的数量告诉您以下有多少字节仍然属于同一个字符。属于该序列的所有字节都以二进制形式以
10
开头。要对字符进行编码,请将其码点转换为二进制,并填入x

例如:U+0754介于U+0080和U+07FF之间,因此需要两个字节。
0x0754
二进制文件是
11101010100
,因此您可以用这些数字替换x:


1101110110010100

简短回答:

UTF-8设计为能够明确地识别文本流中每个字节的类型:

  • 1字节代码(所有且仅ASCII字符)以0开头
  • 两字节代码的前导字节以两个1开头,后跟一个0(即110
  • 三字节代码的前导字节以三个1开头,后跟一个0(即1110
  • 四字节代码的前导字节以四个1开头,后跟一个0(即11110
  • 连续字节(在所有多字节代码中)以一个1开头,后跟一个0(即10

您的示例由Unicode代码点U+0041和U+0754组成,在UTF-8中编码为:

010000011101110110010100

因此,在解码时,UTF-8知道第一个字节必须是1字节代码,第二个字节必须是2字节代码的前导字节,第三个字节必须是延续字节,并且由于第二个字节是2字节代码的前导字节,所以第二个字节和第三个字节必须一起形成这个2字节代码



请参阅UTF-8如何对Unicode码点进行编码。

为了澄清,ASCII表示标准的7位ASCII,而不是欧洲常用的扩展8位ASCII

因此,第一个字节的一部分(0x80到0xFF)变为双字节表示,第二个字节的一部分变为两个字节(0x0800到0xFFFF)的完整三字节表示

四字节表示仅使用最低的三个字节,并且仅使用‭16.777.215‬ 可用可能性

你有一个xls

这意味着解释器在找到这些二进制模式时必须“跳回”一个NUL(0)字节


希望这对某人有所帮助!

仅供参考,“非英语”没有什么意义,因为即使在英语中,也经常使用许多“外国”字符;你是→ 天真的← 如果你不这么认为的话。;)UTF-8中没有“双字节”字符的强烈概念。UTF-8以一到四个代码单元对每个Unicode码点进行编码。二对三没有什么特别之处。现在我了解了UTF-8编码是如何工作的,以及它是如何从字节序列中识别单字节和双字节字符的。所以UTF-8遵循这种模式来识别单个字符的连续字节,所以另一种编码格式也有这种模式来分隔单个字符的字节,对吗?另外两种Unicode格式是UTF-16和UTF-32。UTF-32使用四个字节的单位,每个字节足以容纳所有可能的Unicode值,因此所有代码点都只需保存而不作修改。U+0754变为00 00 07 54。UTF-16使用两个字节的单位,每个字节足以容纳U+FFFF之前的所有字符,因此U+0754变为07 54。FFFF之外的所有内容都使用两个所谓的代理进行编码,这两个代理是任何字符都不使用的特殊双字节代码点。同样,开始代理和结束代理的代码点没有重叠。请参阅维基百科上的详细解释和示例:,@RandomGuy32谢谢您的回答。我也在试着了解这些东西。“U+0754在U+0080和U+07FF之间”,我不太明白这个数字系统。你怎么知道这是真的