unicode 标准中有足够的代码点,您需要 4 个字节来存储它们。这就是 UTF-32 编码的作用。然而,UTF-8 编码通过使用一种称为“可变宽度编码”的东西以某种方式将这些压缩到更小的空间中。
事实上,它设法在一个字节中表示 US-ASCII 的前 127 个字符,这看起来与真正的 ASCII 完全一样,因此您可以将大量 ascii 文本解释为 UTF-8,而无需对其进行任何操作。巧妙的把戏。那么它是怎样工作的?
我将在这里提出并回答我自己的问题,因为我只是做了一些阅读来弄清楚它,我认为它可能会为其他人节省一些时间。另外,如果我有一些错误,也许有人可以纠正我。
每个字节都以几个位开头,告诉您它是单字节代码点、多字节代码点还是多字节代码点的延续。像这样:
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
由于您可以从前几位中分辨出您正在查看的字节类型,因此即使某处发生了损坏,您也不会丢失整个序列。
RFC3629 - UTF-8, a transformation format of ISO 10646 是此处的最终权威,并具有所有解释。
简而言之,代表单个字符的 UTF-8 编码的 1 到 4 字节序列的每个字节中的几个位用于指示它是尾随字节还是前导字节,如果是,则后面有多少字节。其余位包含有效负载。
UTF-8 是另一种使用 8 位字节在内存中存储 Unicode 代码点字符串(即那些神奇的 U+ 数字)的系统。在 UTF-8 中,从 0 到 127 的每个代码点都存储在一个字节中。只有 128 及以上的代码点使用 2、3 存储,实际上最多 6 个字节。
不定期副业成功案例分享
next char is continuation
?如果我们得到 3 字节字符,那么它就像:1xxxxxxx 1xxxxxxx 0xxxxxxx
,这样浪费的空间就会更少。