字符编码

本文中出现的所有数字均为自然书写(低位在右)

本文中出现的所有字节流均为低地址字节在左

Unicode

Unicode 标准由统一码联盟(The Unicode Consortium)制定。

Unicode 将字符与0x00xD7FF之间、0xE0000x10FFFF之间的数字一一对应。最多可以表示 1112064 个字符。

Unicode 字符通常使用 U+十六进制数表示。

代理项对

0xD8000xDFFF之间的数字用于构建代理项对(surrogates pair):

  • 0xD8000xDCFF称为高代理项(high surrogates)。
  • 0xDD000xDFFF称为低代理项(high surrogates)。

代理项对的意义是实现 UTF-16 的 2、4 字节变长存储。因此,代理项对被禁止对应任何字符。

在 UTF-16 的处理过程中,计算机通常将 2 个字节的 UTF-16 解码成 1 个 Unicode。代理项对的出现指示计算机需要将 4 个字节的 UTF-16 解码成 1 个 Unicode。具体的转换方式详见后文 UTF-16 部分。

平面

Unicode 被划分为 0-16 共 17 个平面(plain),每个平面包含 65536 个字符。

将 Unicode 右移 2 字节即可得到所在平面的编号。

其中U+0U+FFFF所在的第 0 平面称为基本多文种平面(Basic Multilingual Plane,BMP)。

UTF

Unicode 仅仅指定了字符与数字的映射关系,并没有指定其实际存储方式。Unicode 的存储方式称为 UTF。

UTF 全称 Unicode Transform Format,是 Unicode 的转换格式。

UTF 标准由统一码联盟(The Unicode Consortium)制定。

UTF-8

UTF-8 是一种 Unicode 的 1-4 字节变长存储方式,向下兼容 ASCII(ISO-­646)和 ANSI(扩展 ASCII ,ISO-­8859­‐1­‐1987,Latin-1)。

存储方式:

#Unicodebit 容量字节流
1U+0U+7F70b0xxxxxxx
2U+80U+7FF110b110xxxxx 0b10xxxxxx
3U+800U+FFFF160b1110xxxx 0b10xxxxxx 0b10xxxxxx
4U+10000U+10FFFF210b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx

编码方法:

  • 将 Unicode 转换成二进制编码。
  • 对比二进制编码的位数和 bit 容量,选择合适的编码方式。
  • 从右往左,依次用二进制编码填入字节流中的x,不足的位补0

例1:

  • U+5F20(字符)转换成二进制编码0b 0101 1111 0010 0000
  • 二进制编码的位数为15,选择编码方式3。
  • 0b 101 111100 100000填入,得到 UTF-8 的二进制形式0b11100101 0b10111100 0b10100000(十六进制形式0xE5 0xBC 0xA0)。

例2:

  • U+1F604(字符

相关推荐