字符编码
本文中出现的所有数字均为自然书写(低位在右)。
本文中出现的所有字节流均为低地址字节在左。
Unicode
Unicode 标准由统一码联盟(The Unicode Consortium)制定。
Unicode 将字符与0x0
至0xD7FF
之间、0xE000
至0x10FFFF
之间的数字一一对应。最多可以表示 1112064 个字符。
Unicode 字符通常使用 U+十六进制数
表示。
代理项对
0xD800
至0xDFFF
之间的数字用于构建代理项对(surrogates pair):
0xD800
至0xDCFF
称为高代理项(high surrogates)。0xDD00
至0xDFFF
称为低代理项(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+0
至U+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)。
存储方式:
# | Unicode | bit 容量 | 字节流 |
---|---|---|---|
1 | U+0 至U+7F | 7 | 0b0xxxxxxx |
2 | U+80 至U+7FF | 11 | 0b110xxxxx 0b10xxxxxx |
3 | U+800 至U+FFFF | 16 | 0b1110xxxx 0b10xxxxxx 0b10xxxxxx |
4 | U+10000 至U+10FFFF | 21 | 0b11110xxx 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
(字符