ASCII、Unicode和UTF-8

4 阅读3分钟

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