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

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 

既然你可以从头几个字节中看出你正在看什么types的字节,那么即使某个地方出了问题,你也不会失去整个序列。

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

简而言之,UTF-8编码的1到4字节序列的每个字节中的几个位表示单个字符,用于指示是否是尾随字节,开头字节,如果是,则跟随多less字节。 其余的位包含有效载荷。

UTF-8是另一个存储你的string的Unicode代码点,这些神奇的U +号码,在内存中使用8位字节的系统。 在UTF-8中,0-127中的每个代码点都存储在一个字节中。 只有代码点128和以上才能使用2,3来存储,实际上最多可以存储6个字节。

从绝对最低限度的每个软件开发人员摘录绝对,积极必须知道Unicode和字符集(没有借口!)