UTF-16 是 Unicode 的一种变长编码,编码单元是 16 位:基本多文种平面(BMP,U+0000–U+FFFF)用 2 个字节,辅助平面(U+10000–U+10FFFF,如多数 emoji)用一对代理项共 4 个字节。下面重点说明规则、原理与易错点。
UTF-16开发详解
BMP 码点直接存为 16 位。辅助平面码点 U:先减 0x10000,得到 20 位,前 10 位加 0xD800 作为高代理,后 10 位加 0xDC00 作为低代理。例如 😀 是 U+1F600 → D83D DE00(BE)。
- 不允许孤立的代理项
- UTF-16 不兼容 ASCII 的单字节形式(拉丁字母也占 2 字节)
- 文件开头的 BOM 用于识别端序;协议里更推荐明确写 UTF-16BE/LE
- 正则和 len() 在 JS/Java 里按代码单元计数,一个 emoji 长度是 2
示例
输入:你好,世界
编码结果:
UTF-16BE 4F 60 59 7D FF 0C 4E 16 75 4C;UTF-16LE 60 4F 7D 59 0C FF 16 4E 4C 75;带 BOM 的默认 UTF-16(本机/Python 为 LE)FF FE 60 4F 7D 59 0C FF 16 4E 4C 75
说明:共 10 字节(不含 BOM)。BMP 字符 2 字节,辅助平面 4 字节(代理对)。
中文的处理
常用汉字“中”U+4E2D 的 UTF-16BE 是 4E 2D,LE 是 2D 4E。拼音、标点若在 BMP 同样是 2 字节。
特殊字符
BOM FE FF(BE)或 FF FE(LE)。零宽字符、emoji(如 😀 的 BE 为 D8 3D DE 00)占 4 字节。
本站的字符编码检测工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。
常见问题
【如何区分 UTF-16BE 和 LE?】看 BOM:FE FF 是 BE,FF FE 是 LE;没有 BOM 时必须由协议声明。
【为什么 JavaScript 里 emoji 的 length 是 2?】length 按 UTF-16 代码单元计数,emoji 是一个代理对。
【UTF-16 和 UCS-2 有什么区别?】UCS-2 只覆盖 BMP,没有代理对;UTF-16 是 UCS-2 的超集。
文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。