Unicode 中的 code point 和 code unit

@zhirui1994 2019-01-08 16:11:53发表于 zhirui1994/zhirui1994.github.io 计算机编码

Unicode (万国码,统一码)

Unicode是计算机科学领域的一项世界通用字符编码标准。是计算机中二进制数到真实世界中的实际符号的映射集。其发展由非营利机构统一码联盟进行推进。
而我们常见的UTF-8,UTF-16,UTF-32都是Unicode标准的实现方式。

code point(码位, 编码位置,code position)

即编码中,某个字符在码空间中的的位置,就是这个字符的码位。例如:ASCII码包含128个码位,范围是0x0-0x7F(十六进制)。而unicode包含1,114,112个码位,范围是0x0-0x10FFFF。Unicode码空间划分为17个Unicode字符平面(基本多文种平面,16个辅助平面),每个平面有65,536(= 216)个码位。因此Unicode码空间总计是17 × 65,536 = 1,114,112。

code unit (码元)

即实际编码实现中的,编码单元。
UTF-8的码元是一个字节(8bit)。
UTF-16的码元是两个字节(16bit)。
UTF-32的码元是四个字节(32bit)。

UFTF-8

UTF-8使用可变长度的字节序来表示字符,动态的使用1-6个字节来表示一个字符。
所以在UTF-8中:
1码位(code point)= 1-6码元(code unit)
1码元(code unit) = 8bit
UTF-8的编码规则很简单, 只有两条:

  1. 对于单字节的符号, 字节的第一位设为0, 后面7位为这个符号的unicode码. 因此对于英语字母, UTF-8编码和ASCII码是相同的.
  2. 对于n字节的符号(n>1), 第一个字节的前n位都设为1, 第n+1位设为0, 后面字节的前两位一律设为10. 剩下的没有提及的二进制位, 全部为这个符号的unicode码.
Unicode符号范围(十六进制) UTF-8编码方式(二进制)
0000 0000 - 0000 007F 0xxxxxxx
0000 0000 - 0000 07FF 110xxxxx 10xxxxxx
0000 0000 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000 - 03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000 - 7FFF FFFF 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

UTF-16

UTF-16使用可变长度的字节序来表示字符。动态的使用1-2个2字节单元(16bit)来表示一个字符。
所以在UTF-16中:
1码位(code point)= 1-2码元(code unit)
1码元(code unit) = 16bit

UTF-32

UTF-32使用定长的4个字节表示一个字符。
所以在UTF-32中:
1码位(code point)= 1码元(code unit)= 32bit