1

不在基本多语言平面 (BMP) 中的 Unicode 字符(代码点)可能由两个字符(代码单元)组成,称为代理对。

'ab' 是两个代码单元和两个代码点。(所以两个字符和两个字符。)

'a' 是三个代码单元和两个代码点。(所以三个字符和两个字符。)

我的代码不需要使用旧版本的 JavaScript。ES6 或任何最现代的东西。

我如何访问最后一个角色,无论它是否是 Astral 角色?

将字符串拆分为“除了最后一个字符之外的所有字符”和“最后一个字符”也可以。

4

2 回答 2

2

传播将把一个字符串分解成它的代码点

[...'a'].pop()
于 2017-07-11T15:32:01.963 回答
1

我从其他 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);

(不需要锚,因为.*会很贪婪。)

于 2017-07-11T15:57:15.837 回答