2017-09-11 79 views
3

假设我们有一些(星光)Unicode字符的字符串:如何从一个字符串获得第n(Unicode)的字符在JavaScript

const s = 'Hi Unicode!' 

[]运营商和.charAt()方法不用于获取工作第四字符,这应该是“”:

> s[3] 
'�' 
> s.charAt(3) 
'�' 

.codePointAt()确实获得第四届字符正确的值,但不幸的是它是一个数,必须转换BA CK为字符串使用String.fromCodePoint()

> String.fromCodePoint(s.codePointAt(3)) 
'' 

类似地,字符串转换成使用层片阵列产生有效的Unicode字符,所以这是获得第四一个的另一种方式:

> [...s][3] 
'' 

但我可以”不敢相信,从字符串要多少回串,或者是由于到字符串分割成一个数组都在做这种看似琐碎的事情的唯一途径。没有一个简单的方法来做到这一点?

> s.simpleMethod(3) 
'' 

注:我知道,“性格”的定义有些模糊,但对这个问题的目的,字符仅仅是对应于一个Unicode码点(无组合字符符号,没有字形集群,等等)。

更新说明:String.fromCodePoint(str.codePointAt(n))方法是不是真的可行,因为n个位置有没有采取以前的星体符号考虑:String.fromCodePoint(''.codePointAt(1)) // => '�'


(我觉得有点哑问这个,就像我可能缺少一些明显的东西,但previous answers对这个问题不适用于星体平面上带有Unicode符号的字符串。)

+1

你见过这个页面的https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/charAt与一些代码示例? – ivo

+0

@ivo不,我没有看到,有趣!代码示例有一个“固定”版本的charAt,这很有用,但我想知道是否有一种好的方法已经支持语言 – epidemian

+0

它是Javascript。简单的事情不能这么简单:) – jorgonor

回答

3

字符串迭代器是迭代代码点而不是UCS-2/UTF-16代码的唯一代码单位。所以:

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 + + U+200D ZERO WIDTH JOINER + )。 Text segmentation有帮助。

你真的需要得到字符串中的第4个码点,虽然?你的用例是什么?

+0

那么,处理你的特性为“破坏”,以及哪个OP特别提到他并不关心,需要专门的语言,如卡纳达语,也有复杂的集群,只能由非常复杂的算法组成的逻辑。 –

+0

感谢Mathias!你关于Unicode的文章是超彻底的! 好的,所以数组spat方法可能是最简单的方法。这是...我猜不是太好。 回答您实际需要获得第四个代码点的问题:不,我的原始用例涉及获取第一个代码点。我注意到'str [0]'不适用于某些角色,所以我最终问自己“等等,你从JS中的字符串中得到一个特定的字符到底是怎么回事?”,在这里我们是... – epidemian

0

您可以使用新的u标志,正则表达式,如果它提供给你。

const chars = 'Hi Unicode!'.match(/./ug); 
 
console.log(chars);

相关问题