关于 unicode
对这些概念头疼了很久,尝试简单的整理下,不确切的地方欢迎指正~
1. Unicode
- Unicode 是一个字符集,而不是一种编码方案
- 简单来说 Unicode 是希望给地球上每一个字符一个数字编号,从而解决不同编码之间不统一的问题
- Unicode 是没法直接拿来用的,我们使用的是它的编码方案
2. 编码方案
- 通常使用的 UTF-8,UTF-16等等都是 Unicode 的编码方案
- 所谓编码方案就是按一定的规则对 Unicode 的字符编号进行编码
- 当然不同的编码的同一个字符,最后解析成 Unicode 字符编号都是一样的
3. 字体与 Unicode
- 计算机使用字符的 Unicode 编号去寻找字体内的字符
- 字体内部的特殊数据结构存储了 Unicode 编号和字符的对应关系
4. 例子
- 汉字 月的 Unicode 编号 10 进制为26376
- Unicode 编号表示为 16 进制 是 U+6708
- 在 python 中用 u"\u6708"表示
- 在 UTF-8 中的编码是 0xE6 0x9C 0x88,使用了 3 个 Byte 来表示
5. UTF-8 和 Unicode 转换
- Unicode 转 UTF-8 - 汉字 月的 Unicode 是26376,转换为二进制是1100111 00001000
- 根据值大于 0x800小于0x10000可以判断为三字节存储
- 将 Unicode 二进制从低位往高位取出二进制数字,每次取 6 位,并按一定的规则进行填补
 - 转换- 110 011100 001000 
 11100110 10011100 10001000
 0xE6 0x9C 0x88
- 汉字 
- UTF-8 转 Unicode 
 同理进行逆运算即可
6. 遗留编码
- ASCII、- GB 2312、- Big5、- GBK、- GB 18030这些都属于遗留编码方案
- GB 2312 通常认为是字符集和编码方案一体的
- 将 GB 2313 编码转换为 Unicode 编号,需要通过转换表查询,无法像 UTF-8 一样直接根据编码规则转换