ASCII
ASCII(美国信息交换标准代码)采用7位二进制编码,定义了128个字符的映射关系。
- 控制字符区(0-31及127):如换行符
\n(0x0A)、回车符\r(0x0D); - 可打印字符区(32-126):涵盖大小写字母、数字及标点符号。
Unicode
Unicode 是统一字符编码标准,旨在为世界上所有文字、符号、表情分配唯一的数字编号,这个编号叫码点(Code Point),格式为 U+[十六进制数字]。
-
Unicode 使用21位二进制表示码点,完整码点范围是
U+000000 ~ U+10FFFF,6位十六进制是 Unicode 码点的标准表示格式; -
Unicode 为了方便管理码点,共定义了17个编码平面(编号0-16),每个编码平面大小是2^16,对应码点范围是
U+n0000 ~ U+nFFFF,其中 n 表示编码平面编号; -
基本多语言平面(BMP)是第0号编码平面,对应码点范围是
U+0000 ~ U+FFFF。
它只规定字符和码点的转换对应关系,不规定码点是如何转换成计算机字节存储的。
Unicode 是字符集(逻辑标准),UTF-8 是它的具体编码实现(物理存储规则)。
UTF-8
UTF-8 是 Unicode 的一种变长字节(1~4字节,英文占1字节兼容 ASCII)编码实现方案,作用是把 Unicode 码点转换成计算机可存储/传输的字节序列。
UTF-8 采用1-4字节的可变长度编码,通过最高位标记字节长度:
0xxxxxxx- 1字节(兼容ASCII)110xxxxx 10xxxxxx- 2字节1110xxxx 10xxxxxx 10xxxxxx- 3字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx- 4字节
首字节用开头连续的二进制1标识整个字符的编码字节数(比如2个1表示占2字节,3个1表示占3字节),连续1后紧跟1个0,作为格式分隔。
后续字节(若有)固定以二进制10开头,剩余位用于存储 Unicode 码位的实际数据。
Unicode 码点转 UTF-8 编码
汉字 国 = U+56FD(十六进制)(Unicode 码点)= 22269(十进制)= 101011011111101(二进制)(15位)
匹配3字节 UTF-8 格式(1110xxxx 10xxxxxx 10xxxxxx),格式总空位:4 + 6 + 6 = 16位。
码点二进制 101011011111101 有15位,前面补0至16位 010101101111101,并且按照 UTF-8 的3字节的存储位空位拆分 0101 011011 11101。
将格式位和存储位拼接 1110 + 0101、10 + 011011、10 + 11101,最终得到完整 UTF-8 编码 11100101 10011011 1011101。