1. Unicode与UTF-16编码基础概念
计算机存储和传输文本时,需要将字符转换为二进制形式。Unicode为每个字符分配唯一编号(码点),而UTF-16是实现Unicode的一种具体编码方案。理解这两者的关系,是处理现代文本数据的基础能力。
Unicode码点范围从U+0000到U+10FFFF,共1,114,112个可能位置。UTF-16编码需要解决的核心问题就是:如何用16位(2字节)的基本单元,表示这个超大范围的字符集?
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. UTF-16编码的核心规则解析
2.1 基本多文种平面(BMP)字符编码
U+0000到U+FFFF范围内的字符(称为BMP字符)直接使用一个16位单元表示:
- 示例:字母"A"(U+0041)编码为
0x0041 - 汉字"中"(U+4E2D)编码为
0x4E2D
这个范围覆盖了绝大多数常用字符,包括拉丁字母、中日韩文字、标点符号等。
2.2 辅助平面字符的代理对机制
对于U+10000到U+10FFFF的字符,UTF-16采用4字节(两个16位单元)表示,称为代理对(Surrogate Pair):
-
计算步骤:
- 码点值减去0x10000,得到20位中间值
- 高10位(范围0-0x3FF)加上0xD800,得到高位代理
- 低10位(范围0-0x3FF)加上0xDC00,得到低位代理
-
示例:😂表情符号(U+1F602)
- 0x1F602 - 0x10000 = 0xF602
- 高10位:0x3D8 → 0xD800 + 0x3D8 = 0xD83D
- 低10位:0x202 → 0xDC00 + 0x202 = 0xDE02
- 最终编码:
0xD83D 0xDE02
3. 编码转换的实践要点
3.1 检测代理对的实现逻辑
判断码点是否需要代理对:
python复制def needs_surrogate(codepoint):
return 0x10000 <= codepoint <= 0x10FFFF
3.2 完整转换算法实现
Python示例代码:
python复制def unicode_to_utf16(codepoint):
if 0x
