关于 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 一样直接根据编码规则转换