1. Unicode与UTF-16编码基础概念
计算机存储和传输文本时,需要将字符映射为二进制数据。Unicode为全球所有字符分配唯一编号(码点),而UTF-16是实现Unicode的一种具体编码方案。码点范围从U+0000到U+10FFFF,共1,114,112个可能位置。
UTF-16采用16位(2字节)为基本编码单元,但通过代理对机制扩展支持更大范围的字符。这种设计平衡了存储效率与表达能力——常用字符(如拉丁字母、汉字基本区)只需2字节,而罕见字符(如emoji、古文字)使用4字节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. UTF-16编码规则详解
2.1 基本多文种平面(BMP)字符编码
BMP包含U+0000到U+FFFF的字符,直接使用一个16位单元表示:
- 示例:字母"A"(U+0041)编码为
0x0041 - 汉字"中"(U+4E2D)编码为
0x4E2D
注意:字节序问题。UTF-16存在大端(BE)和小端(LE)两种存储方式,通过BOM(Byte Order Mark,U+FEFF)标识。Windows系统常用小端序。
2.2 辅助平面字符编码(代理对机制)
超出BMP的字符(U+10000到U+10FFFF)采用4字节编码,计算过程如下:
-
码点减去0x10000,得到20位中间值
- 示例:🐱(U+1F431)→ 0x1F431 - 0x10000 = 0x0F431
-
分割为高10位和低10位:
- 高10位:0x0F431 >> 10 = 0x03D
- 低10位:0x0F431 & 0x3FF = 0x031
-
加上代理区基值:
- 高代理(Lead Surrogate):0xD800 + 高10位 = 0xD800 + 0x03D = 0xD83D
- 低代理(Trail Surrogate):0xDC00 + 低10位 = 0xDC00 + 0x031 = 0xDC31
最终🐱编码为0xD83D 0xDC31。解码时反向操作即可还原原始码点。
3. 编码转换实战示例
3.1 Python实现代码
python复制def unicode_to_utf16(code_point):
if 0xD800 <= code_point
