gogoend / blog

blogs, ideas, etc.
MIT License
9 stars 2 forks source link

Unicode;UTF-16;代理对 #75

Open gogoend opened 2 years ago

gogoend commented 2 years ago

某些仅有一个字符的字符串,长度居然不为1?

'😂'.length // 2

'𠮷'.length // 2

'✝️'.length // 2

'9️⃣'.length // 3

'👨‍👩‍👧‍👦'.length // 11

代理对:码点超过0xFFFF的字符需要进行转换,以使用多个码点来保存这个字符 —— 因为UTF-16下,单独一个码点存不下这个字符。

Unicode 标准规定 U+D800...U+DFFF 的值不对应于任何字符,所以可以用来做标记。

https://juejin.cn/post/7025400771982131236

看起来增补平面可以表示(2**20)-1个字符;使用代理对表示,可以恰好覆盖增补平面所有字符

增补平面码点到代理对转换

H = Math.floor((C - 0x10000) / 0x400) + 0xD800
L = (C - 0x10000) % 0x400 + 0xDC00

代理对转换到增补平面码点

C = (H - 0xD800) * 0x400 + L - 0xDC00 + 0x10000

字符变形

'🈚︎'.split('').map(char => char.charCodeAt().toString(16))
// (3) ['d83c', 'de1a', 'fe0e']
'🈚️'.split('').map(char => char.charCodeAt().toString(16))
// (3) ['d83c', 'de1a', 'fe0f']
gogoend commented 9 months ago

wow