假设我们有一个包含一些(星体)Unicode字符的字符串:
const s = 'Hi Unicode!'
[]
运算符和.charAt()
方法不适用于获取第4个字符,该字符应为"":
> s[3]
'�'
> s.charAt(3)
'�'
.codePointAt()
获取第4个字符的正确值,但不幸的是它是一个数字,必须使用String.fromCodePoint()
转换回字符串:
> String.fromCodePoint(s.codePointAt(3))
''
类似地,使用splats将字符串转换为数组会产生有效的Unicode字符,这是获得第4个字符的另一种方式:
> [...s][3]
''
但是我不能相信从字符串到数字再回到字符串,或者必须将字符串拆分成数组是实现这个看似微不足道的事情的唯一方法。难道没有一种简单的方法可以做到这一点吗?
> s.simpleMethod(3)
''
注意:我知道"字符"的定义有点模糊,但出于这个问题的目的,字符只是与Unicode代码点相对应的符号(没有组合字符,没有字形集群等)。
更新:String.fromCodePoint(str.codePointAt(n))
方法确实不可行,因为n
位置并未将以前的星体符号考虑在内:String.fromCodePoint(''.codePointAt(1)) // => '�'
(我觉得有点愚蠢地问这个;就像我可能错过了一些明显的东西。但previous answers这个问题不适用于在星体平面上使用Unicode simbols的字符串。)
答案 0 :(得分:9)
字符串迭代器是唯一迭代代码点而不是UCS-2 / UTF-16代码单元的东西。所以:
const string = 'Hi Unicode!';
for (const symbol of string) {
console.log(symbol);
}
所以要根据字符串中的索引获取特定的代码点:
const string = 'Hi Unicode!';
// Note: The spread operator uses the string iterator under the hood.
const symbols = [...string];
symbols[3]; // ''
但是,这会打破字形集群或表情符号序列,例如
( + U+200D ZERO WIDTH JOINER + + U+200D ZERO WIDTH JOINER + {{3 }} + + U+200D ZERO WIDTH JOINER)。 有助于此。
你真的需要获得字符串中的第4个代码点吗?你的用例是什么?
答案 1 :(得分:0)
如果您可以使用新的u
标记来进行正则表达式。
const chars = 'Hi Unicode!'.match(/./ug);
console.log(chars);