且听疯吟 在此记录扯淡的青春
关于 unicode

对这些概念头疼了很久,尝试简单的整理下,不确切的地方欢迎指正~

1. Unicode

  • Unicode 是一个字符集,而不是一种编码方案
  • 简单来说 Unicode 是希望给地球上每一个字符一个数字编号,从而解决不同编码之间不统一的问题
  • Unicode 是没法直接拿来用的,我们使用的是它的编码方案

2. 编码方案

  • 通常使用的 UTF-8UTF-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. 遗留编码

  • ASCIIGB 2312Big5GBKGB 18030 这些都属于遗留编码方案
  • GB 2312 通常认为是字符集和**编码方案**一体的
  • 将 GB 2313 编码转换为 Unicode 编号,需要通过转换表查询,无法像 UTF-8 一样直接根据编码规则转换