用 JavaScript 处理 UTF-16

73 0

UTF-16 是 Unicode 的一种变长编码,编码单元是 16 位:基本多文种平面(BMP,U+0000–U+FFFF)用 2 个字节,辅助平面(U+10000–U+10FFFF,如多数 emoji)用一对代理项共 4 个字节。下面重点说明浏览器与 Node 写法。

用 JavaScript 处理 UTF-16

下面是 JavaScript 中处理UTF-16的常用写法:

// JS 字符串本身是 UTF-16 代码单元
"😀".length;                 // 2
[... "😀"].length;           // 1
new TextEncoder().encode("中"); // 这是 UTF-8,不是 UTF-16

运行前确认输入的字符集(推荐 UTF-8),结果可以用本站工具交叉核对。

示例

输入:https://www.123wen.cn/?q=测试

编码结果:

UTF-16BE 00 68 00 74 00 74 00 70 00 73 00 3A 00 2F 00 2F 00 77 00 77 00 77 00 2E 00 31 00 32 00 33 00 77 00 65 00 6E 00 2E 00 63 00 6E 00 2F 00 3F 00 71 00 3D 6D 4B 8B D5;UTF-16LE 68 00 74 00 74 00 70 00 73 00 3A 00 2F 00 2F 00 77 00 77 00 77 00 2E 00 31 00 32 00 33 00 77 00 65 00 6E 00 2E 00 63 00 6E 00 2F 00 3F 00 71 00 3D 00 4B 6D D5 8B;带 BOM 的默认 UTF-16(本机/Python 为 LE)FF FE 68 00 74 00 74 00 70 00 73 00 3A 00 2F 00 2F 00 77 00 77 00 77 00 2E 00 31 00 32 00 33 00 77 00 65 00 6E 00 2E 00 63 00 6E 00 2F 00 3F 00 71 00 3D 00 4B 6D D5 8B

说明:共 54 字节(不含 BOM)。BMP 字符 2 字节,辅助平面 4 字节(代理对)。

与相关技术的区别

UTF-16 与 UTF-8:UTF-8 兼容 ASCII、英文 1 字节、汉字 3 字节,更适合交换;UTF-16 英文 2 字节,汉字通常也是 2 字节,适合在内存中随机访问 UTF-16 代码单元。UTF-32 则是固定 4 字节,更占空间。

Go 示例

下面是 Go 中处理UTF-16的常用写法:

import "unicode/utf16"
r := utf16.Encode([]rune("😀"))  // 两个 uint16 代理项

运行前确认输入的字符集(推荐 UTF-8),结果可以用本站工具交叉核对。

本站的字符编码检测工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。

常见问题

【如何区分 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 的超集。

文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。

署名:123问编辑部 · 最近修订:2026-11-11 · 已按编辑与审核说明检查;内容仅供参考,不构成医疗、法律或投资建议。发现错误可查看纠错方式。

标签: UTF-16 数码开发

抱歉,评论功能暂时关闭!