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)。
示例
输入:2026-11-11
编码结果:
UTF-16BE 00 32 00 30 00 32 00 36 00 2D 00 31 00 31 00 2D 00 31 00 31;UTF-16LE 32 00 30 00 32 00 36 00 2D 00 31 00 31 00 2D 00 31 00 31 00;带 BOM 的默认 UTF-16(本机/Python 为 LE)FF FE 32 00 30 00 32 00 36 00 2D 00 31 00 31 00 2D 00 31 00 31 00
说明:共 20 字节(不含 BOM)。BMP 字符 2 字节,辅助平面 4 字节(代理对)。
注意事项
- 把 UTF-16 文件当 UTF-8 打开会出现空格间隔的字母或乱码
- JS 的 "😀".length === 2,遍历要用 for...of 或 Array.from
- 不要截断在代理对中间,会得到非法字符
- Python 的 encode("utf-16") 默认带 BOM,encode("utf-16le") 不带
常见报错
- UnicodeEncodeError / unpaired surrogate:字符串里有孤立代理项
- 文件开头出现 ÿþ 或 þÿ:UTF-16 BOM 被按 Latin-1 显示
- 截取字符串后出现 �:代理对被切断
本站的字符编码检测工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。
常见问题
【一个汉字在 UTF-16 中占几个字节?】常用汉字位于 BMP,占 2 个字节;生僻字若在扩展区则占 4 个字节。
【如何区分 UTF-16BE 和 LE?】看 BOM:FE FF 是 BE,FF FE 是 LE;没有 BOM 时必须由协议声明。
【为什么 JavaScript 里 emoji 的 length 是 2?】length 按 UTF-16 代码单元计数,emoji 是一个代理对。
文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。