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 及端序
- 在编辑器中改存为 UTF-8(无 BOM)以便交换
- 在程序里明确指定 utf-16、utf-16be 或 utf-16le,不要依赖默认端序
示例
输入:user@example.com
编码结果:
UTF-16BE 00 75 00 73 00 65 00 72 00 40 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2E 00 63 00 6F 00 6D;UTF-16LE 75 00 73 00 65 00 72 00 40 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2E 00 63 00 6F 00 6D 00;带 BOM 的默认 UTF-16(本机/Python 为 LE)FF FE 75 00 73 00 65 00 72 00 40 00 65 00 78 00 61 00 6D 00 70 00 6C 00 65 00 2E 00 63 00 6F 00 6D 00
说明:共 32 字节(不含 BOM)。BMP 字符 2 字节,辅助平面 4 字节(代理对)。
中文的处理
常用汉字“中”U+4E2D 的 UTF-16BE 是 4E 2D,LE 是 2D 4E。拼音、标点若在 BMP 同样是 2 字节。
怎么选
文件存储和网络传输优先 UTF-8;与 Java/Windows 内部 API 交互时才使用 UTF-16,并明确端序。
UTF-16 与 UTF-8:UTF-8 兼容 ASCII、英文 1 字节、汉字 3 字节,更适合交换;UTF-16 英文 2 字节,汉字通常也是 2 字节,适合在内存中随机访问 UTF-16 代码单元。UTF-32 则是固定 4 字节,更占空间。
本站的字符编码检测工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。
常见问题
【为什么 JavaScript 里 emoji 的 length 是 2?】length 按 UTF-16 代码单元计数,emoji 是一个代理对。
【UTF-16 和 UCS-2 有什么区别?】UCS-2 只覆盖 BMP,没有代理对;UTF-16 是 UCS-2 的超集。
【英文用 UTF-16 浪费空间吗?】每个 ASCII 字符要 2 字节,是 UTF-8 的两倍,所以文本文件更推荐 UTF-8。
文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。