1. Unicode与UTF-16编码基础
Unicode作为全球统一的字符编码标准,为每个字符分配唯一的码点(Code Point)。而UTF-16则是Unicode的一种实现方式,它采用16位码元(Code Unit)来表示字符。理解UTF-16的编码规则对于处理文本数据、开发国际化应用以及调试字符编码问题至关重要。
1.1 基本多文种平面(BMP)的概念
Unicode将所有字符划分为17个平面(Plane),每个平面包含65,536个码点。其中:
- 基本多文种平面(BMP):包含U+0000到U+FFFF的码点,涵盖了世界上绝大多数常用字符
- 辅助平面:包含U+10000到U+10FFFF的码点,用于存储较罕见的字符、历史文字和特殊符号
注意:BMP中U+D800到U+DFFF的范围被永久保留为代理区(Surrogate Zone),不能用于表示任何字符。这个特殊设计正是为了UTF-16的代理对机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. UTF-16编码的核心规则
2.1 BMP内字符的编码方式
对于BMP内的字符(U+0000到U+FFFF,不包括代理区),UTF-16采用直接映射的方式:
- 将码点值直接作为一个16位的码元存储
- 有效范围分为两部分:
- 0x0000-0xD7FF
- 0xE000-0xFFFF
实际案例:
- 拉丁字母"A"(U+0041) → UTF-16: 0x0041
- 汉字"中"(U+4E2D) → UTF-16: 0x4E2D
2.2 辅助平面字符的代理对编码
对于辅助平面的字符(U+010000到U+10FFFF),UTF-16使用两个16位码元(共4字节)来表示一个字符,这被称为代理对(Surrogate Pair)。
详细计算步骤:
-
计算中间值:
code复制中间值 = 码点值 - 0x10000这将得到一个20位的值(范围0x00000到0xFFFFF)
-
分割高低位:
- 高10位 = 中间值 >> 10
- 低10位 = 中间值 & 0x3FF
-
组合代理对:
- 高代理(High Surrogate)= 0xD800 + 高10位值
