UTF-16
UTF-16 是 Unicode 的变长编码形式,使用 2 或 4 字节表示一个码点,BMP 字符用 1 个 16 位码单元,补充平面字符用代理对(2 个码单元)。
用途
在 BMP 字符占主导的场景(如 Windows API、Java 字符串内部表示)下兼顾空间效率与全 Unicode 覆盖。
机制
BMP 码点(U+0000-FFFF)直接存为 1 个 16 位单元。补充码点(U+10000-10FFFF)减去 0x10000 后拆为高 10 位与低 10 位,分别加上 0xD800 与 0xDC00 形成代理对。字节序由 BOM(U+FEFF)指示。
用例
- Windows API 内部字符串
- Java/JavaScript 字符串内部表示
- .NET String 内部存储
- 文件名(NTFS)存储
示例
- 输入
A输出0x00 0x41UTF-16BE, 2 bytes
- 输入
😀输出0xD8 0x3D 0xDE 0x00A surrogate pair, 4 bytes
常见错误
- Ignoring surrogate pairs, producing wrong character counts
- Use code-point-aware APIs or surrogate-pair-aware iteration
相关词条
Unicode
Unicode 是国际字符编码标准,为世界上几乎所有书写系统的每个字符分配唯一码点(U+0000 至 U+10FFFF),共 1,114,112 个码点空间。 词汇表
UTF-8
UTF-8 是 Unicode 的变长编码形式,使用 1 至 4 字节表示一个码点,与 ASCII 完全向后兼容,是 Web 与现代系统的事实标准。 词汇表
Surrogate Pair
代理对是 UTF-16 中用两个 16 位码单元表示一个补充平面码点(U+10000 至 U+10FFFF)的机制。 词汇表
BOM
BOM(字节顺序标记)是 Unicode 字符 U+FEFF,置于文本流开头用于指示编码形式与字节序。 词汇表
Endianness
字节序是多字节数值在内存中存储的字节排列顺序:大端(big-endian)高位在前,小端(little-endian)低位在前。 词汇表