不在基本多语言平面 (BMP) 中的 Unicode 字符(代码点)可能由两个字符(代码单元)组成,称为代理对。
'ab' 是两个代码单元和两个代码点。(所以两个字符和两个字符。)
'a' 是三个代码单元和两个代码点。(所以三个字符和两个字符。)
我的代码不需要使用旧版本的 JavaScript。ES6 或任何最现代的东西。
我如何访问最后一个角色,无论它是否是 Astral 角色?
将字符串拆分为“除了最后一个字符之外的所有字符”和“最后一个字符”也可以。
不在基本多语言平面 (BMP) 中的 Unicode 字符(代码点)可能由两个字符(代码单元)组成,称为代理对。
'ab' 是两个代码单元和两个代码点。(所以两个字符和两个字符。)
'a' 是三个代码单元和两个代码点。(所以三个字符和两个字符。)
我的代码不需要使用旧版本的 JavaScript。ES6 或任何最现代的东西。
我如何访问最后一个角色,无论它是否是 Astral 角色?
将字符串拆分为“除了最后一个字符之外的所有字符”和“最后一个字符”也可以。
传播将把一个字符串分解成它的代码点
[...'a'].pop()
我从其他 SO 问题的答案中知道,Array.from()
带有标志的正则表达式/u
都可以正确处理非 BMP Unicode 字符,但我认为两者都不是最好的答案。
也许我错了,所以这里有两个解决方案:
Array.from()
let c = Array.from('a')[1];
console.log(c);
u
旗帜
let c ='a'.match(/.$/u)[0];
console.log(c);
第二种方法也可以扩展到回答我的问题的第二部分:
let [,l,r] = 'abcd'.match(/(.*)(.)/u);
console.log(l);
console.log(r);
(不需要锚,因为.*
会很贪婪。)