UTF-8“可变宽度编码”如何工作?

时间:2009-10-09 13:02:22

标签: unicode utf-8 character-encoding multibyte

unicode标准中有足够的代码点,你需要4个字节来存储它们。这就是UTF-32编码所做的。然而,UTF-8编码通过使用称为“可变宽度编码”的东西以某种方式将这些压缩到更小的空间。

事实上,它设法用一个字节代表US-ASCII的前127个字符,它看起来与真正的ASCII完全相同,所以你可以解释许多ascii文本,好像它是UTF-8而不做任何事情。干净的把戏。那它是如何运作的?

我将在这里提出并回答我自己的问题,因为我只是做了一些阅读以弄清楚它并且我认为它可能会节省其他人一些时间。如果我有一些错误,也许有人可以纠正我。

3 个答案:

答案 0 :(得分:112)

每个字节以几位开头,告诉您它是单字节代码点,多字节代码点还是多字节代码点的延续。像这样:

0xxx xxxx    A single-byte US-ASCII code (from the first 127 characters)

多字节代码点每个都以几位开头,基本上说“嘿,你还需要读取下一个字节(或两个或三个)来弄清楚我是什么。”他们是:

110x xxxx    One more byte follows
1110 xxxx    Two more bytes follow
1111 0xxx    Three more bytes follow

最后,这些起始码后面的字节都是这样的:

10xx xxxx    A continuation of one of the multi-byte characters

既然你可以从前几位看出你正在看什么类型的字节,那么即使某些东西在某处被破坏,你也不会丢失整个序列。

答案 1 :(得分:8)

RFC3629 - UTF-8, a transformation format of ISO 10646是这里的最终权威,并有所有解释。

简而言之,UTF-8编码的1到4字节序列的每个字节中的几个位表示单个字符,用于指示它是一个尾随字节,一个前导字节,如果是,有多少字节跟随。其余位包含有效负载。

答案 2 :(得分:3)

  

UTF-8是另一种存储系统   您的Unicode代码点字符串,   那些神奇的U +数字,在记忆中   使用8位字节。在UTF-8中,每一个   0-127的代码点存储在a中   单字节。只有代码点128和   事实上,以上使用2,3存储   最多6个字节。

摘自The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)