UTF-16(16-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。见 UTF-16。
Unicode 的编码空间可划分为17个平面(plane),每个平面包含 65536 个码位,计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0),其他平面称为辅助平面(Supplementary Planes)。
| Plane | Number of bytes | First code point | Last code point | |-----------------|---------------------|------------------|-----------------| | 基本平面 | 2 | U+0000 | U+FFFF | | 辅助平面 | 4 | U+10000 | U+10FFFF |
其中:
str.codePointAt(0)
U+10000
,则直接返回,为 UTF-16 编码U+10000
,则分为两个 UTF-16 编码 (codePoint - 0x10000) / 1024 + 0xD800, ((codePoint - 0x10000) % 1024) + 0xDC00
,更详细的描述见下示例如,🍉
'🍉'.codePointAt().toString(16)
得出其十六进制为 0x1f349
0x1f349
减去 0x10000
,结果为 0x0f349
,二进制为 0000 1111 0011 0100 1001
,并分为两部分 0000 1111 00
(0x003c) 和 11 0100 1001
(0x0349)0xd800
到上值,以形成高位:0xd800 + 0x003c = 0xd83c
0xdc00
到下值,以形成低位:0xdc00 + 0x0349 = 0xdf49
在 Javascript 中,可借助于 iconv-lite 进行转化
// Encoding
iconv.encode(str, 'utf16')
// Decoding
iconv.decode(buffer, 'utf16')
> '山月'.encode('utf16').hex()
'fffe715c0867'
> bytes.fromHex('fffe715c0867').decode('utf16')
山月