概述

ASCII用7位即可搞定。0-32是控制字符,32-127是其它字符。这个对于当时美帝和英帝的LAN是够用的。可是后来。。。大家互联了。

Unicode包括所有语言的所有字符。每个字符被赋予一个独一无二的 code point。但是 Unicode 是个抽象概念。存储,传输的过程就需要映射到电脑可以搞定的空间:字节。UTF(unicode transformation format)就是干这个的。

UTF-8

UTF-8是现在最常用的编码方法(encoding scheme)。它充分的体现了人类的智慧,以及 premature optimization 的不必要 -- 人类总能想出办法来填坑的。

牛在哪里?

  1. 以前ASCII编码的英文自动就是UTF-8编码

  2. C语言用0来结束字符串对UTF-8仍然有效。

  3. 无需BOM (byte order mask)

如何做到的?
基本上把 code point 映射到下面的表就可以了。

Bits  Last CP       Byte 1      Byte 2      Byte 3      Byte 4      Byte 5      Byte 6
 7    U+007F        0xxxxxxx
11    U+07FF        110xxxxx    10xxxxxx
16    U+FFFF        1110xxxx    10xxxxxx    10xxxxxx
21    U+1FFFFF      11110xxx    10xxxxxx    10xxxxxx    10xxxxxx
26    U+3FFFFFF     111110xx    10xxxxxx    10xxxxxx    10xxxxxx    10xxxxxx
31    U+7FFFFFFF    1111110x    10xxxxxx    10xxxxxx    10xxxxxx    10xxxxxx    10xxxxxx

所以7位以下的前面加0用一个字节即可。11位的分俩字节,前面各加110和10。等等等等。上表也表示了一个UTF-8编码的字符可以是1个字节,也可以多达6个字节。

发明人是 Ken Thompson 和 Rob Pike。所以大牛就是大牛。这个是造福全人类的东东。

其它

还有 UTF-16 和 UTF-32 这些其(hen)它(lan)的编码格式。这里说不废话就不废话了。


仗键去国
1.5k 声望10 粉丝

码农; 顾问; 架构师; kubernetes, Openstack and docker 贡献者


引用和评论

0 条评论