【发布时间】:2019-08-09 13:26:39
【问题描述】:
UTF-8 将代码点的有效位存储在代码单元的低位中
U+0000-U+007F 0xxxxxxx
U+0080-U+07FF 110xxxxx 10xxxxxx
U+0800-U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+10000-U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
这需要解码器检查over long sequences(例如C0 80而不是00),并且还将可编码的代码点数减少到固定字节数。如果它使用相同的编码但像这样映射代码点
- 前 128 个码位(U+0000—U+007F):1 个字节
- 接下来的 2048 个代码点(U+0080—U+087F):2 个字节。例如。
C0 81:U+0081 - 接下来的 65536 个代码点(U+0880—U+1087F):3 个字节。例如。
E0 B0 B1:U+0881 - 接下来的 131072 个代码点(U+10880—U+10FFFF,直到 U+20880):4 个字节。例如。
F0 B0 B0 B1:U+10881
(即该值将偏移量编码到范围的开头)
然后可以使用更短的序列对更多字符进行编码。解码可能也更快,因为它只需要一个常数加法,这通常比检查过长代码点的分支成本更低。事实上,如果我们从映射中删除代理对范围,则可以将 2048 个字符压缩到 3 个字节中
那么为什么 UTF-8 以这种方式存储代码点?
【问题讨论】:
标签: utf-8 character-encoding history