2015-12-22 28 views
15

我试图将一个字符串分割成单个单词/字符,但是当涉及到表情符号时我遇到了麻烦。安全地分割表情符号

首先,我不能简单地用一个空字符,因为表情符号,一般都具有长度> = 2

"".split("") 
["�", "�"] 

我发现一个emoji regex这主要是工程分割字符串,但现在我看到一些奇怪的肉色块。我甚至在某些情况下看到它们在Twitter上显示。

enter image description here

下面是示出了与肉质块 http://codepen.io/positlabs/pen/QyEOEG?editors=011

enter image description here

UPDATE -----------

问题试行spliddit一个笔,而且我仍然看到了肤色字符的问题。有什么方法可以将它们粘合在一起吗?

http://codepen.io/positlabs/pen/rxLqwL?editors=001

回答

11

JavaScript的字符串是UTF-16,所以你的表情符号在内部表示为两个代码单元:

> "\ud83d\ude0e" === "" 
true 

String.prototype.split功能并没有真正在UTF-16关心surrogate pairs,所以它天真地颠倒了单个代码单元并破坏了表情符号,因为JavaScript没有提供任何方式来处理字符串中的单个字符。

有没有简单的方法来处理它。您需要像spliddit这样的库来正确处理各个代码单元。

我不是100%熟悉术语,所以请根据需要编辑我的答案。

+0

好的,spliddit很好,但它仍然无法重新组合肤色字符。我制作了一支新笔,并会更新我的问题。 –

+0

@positlabs:我现在没有时间查看它,但我非常确定这是代码执行。尝试删除除旗帜和手臂外的所有内容,然后尝试删除其中的一个:http://codepen.io/anon/pen/NxrOoW?editors=001 – Blender

+1

@positlabs:其实,它只是Chrome。我上面的例子适用于Safari和Firefox。可能是一个错误。我会看看是否有一些解决方法。 – Blender

0

spliddit不能正确当前分裂例如这个印地文文本分成5个字符:“अनुच्छेद”

您需要的字形分离器库: https://github.com/orling/grapheme-splitter 这是一个全面实施UAX-29 Unicode的标准,将分裂甚至最奇特的字母,表情符号只是众多使用案例之一