UTF-8 为什么要这么设计

2018-12-16 00:54:03 +08:00
 Chingim

今天想通过 自己设计一个 Unicode 的 编码 来了解字符编码, 结果和真正的 UTF-8 对比, 发现有一些出入, 搜索不到相应的信息, 所以有了这个小小的疑问, 不知道 UTF-8 是一开始就设计成这样还是逐步演变成这样的?

utf-8 是字符集 unicode 的一种不定长的编码格式, 一个 code point 会用 1-4 个字节表示, 具体用多少字节取决于 codepoint 落在哪个区间.

它具体的编码规则是(来源):

以汉字严为例,演示如何实现 UTF-8 编码。 严的 Unicode 是 4E25 ( 100111000100101 ),根据上表,可以发现 4E25 处在第三行的范围内( 0000 0800 - 0000 FFFF ),因此严的 UTF-8 编码需要三个字节,即格式是 1110xxxx 10xxxxxx 10xxxxxx。然后,从严的最后一个二进制位开始,依次从后向前填入格式中的 x,多出的位补 0。这样就得到了,严的 UTF-8 编码是 11100100 10111000 10100101,转换成十六进制就是 E4B8A5。

但是为什么 UTF-8 不用完所有的有效 bit 呢?

UTF-8 是为了省空间而设计的, 是要把这些有效位塞满的吧? 两个字节就把所有的值用上:

难道 UTF-8 让这些位置空着, 就为了不用做额外的加减偏移量的操作? 有了解的老哥来解惑一下么? 有来源就最好了

5613 次点击
所在节点    程序员
24 条回复
Chingim
2018-12-16 22:05:19 +08:00
@Chingim 上条打错了..在假想的算法里, 11000000 10000000 表示的码点不是 U+0000 而是 U+0080
zpxshl
2021-02-22 22:13:15 +08:00
为了可以从中间位置读吧,如果按楼主的设计,一串数据需要从头读到尾才能解码
mattx
2021-04-05 23:54:48 +08:00
@wsxyeah
@BlackL 分析得很有道理
yukinotech
2022-04-15 18:39:40 +08:00
看了一下回答,误解题主的意思的人很多。总结一下认为 1 楼的说法是比较正确的,举个例子:

2 个字节的 utf-8 中
110X XXXX 10XX XXXX 理论可以承载字符 2^11 ,2048 个字符
但根据标准,实际分配给这个段的 unicode 码点范围是 0x81 - 0x7ff ,也就是说只有 1920 个字符,
二进制表示 unicode 码点:0000 1000 0001 - 0111 1111 1111 ,把后 11 位分配到 110X XXXX 10XX XXXX 上,直接位运算是最方便的。
unicode ( 0000 1000 0001 )=> utf-8( 110|<0 0010>| 10|<00 0001|>) 肯定比
unicode ( 0000 1000 0001 )=> utf-8 不浪费版( 1100 0000 1000 0000) 运算方便

utf-8 空间完全够用,不像 utf-16 ,空间极限就是 0x10ffff ,综合来看应该是这个原因吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/517938

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX