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

Unicode 标准中有足够的代码点,需要4个字节来存储所有代码点。这就是 UTF-32编码的作用。然而,UTF-8编码通过使用一种叫做“可变宽度编码”的方法将这些信息压缩到更小的空间中。

事实上,它只用一个字节表示了 US-ASCII 的前127个字符,看起来与真正的 ASCII 完全一样,因此您可以将大量的 ASCII 文本解释为 UTF-8,而不需要对其做任何处理。干得漂亮。那么它是如何工作的呢?

我要在这里提出并回答我自己的问题,因为我刚刚读了一些资料来弄明白,我认为这可能会节省其他人的一些时间。而且如果我说错了,也许有人能纠正我。

26633 次浏览

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

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

Finally, the bytes that follow those start codes all look like this:

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

由于您可以从前几位判断正在查看的字节类型,因此即使某个地方出现了错误,您也不会丢失整个序列。

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

节选自 绝对最低限度每个软件开发人员绝对,肯定必须知道 Unicode 和字符集(没有借口!)

一种 ISO 10646 的转换格式 RFC3629-UTF-8是这里的最终权威,并有所有的解释。

简而言之,UTF-8编码的1到4字节序列中每个字节中的几个位表示一个字符,用来表示它是否是一个尾随字节、一个前导字节,如果是,则表示后面有多少字节。剩下的部分包含有效载荷。