安全地拆分表情符号

Splitting emoji, safely

我正在尝试将一个字符串拆分为单个字符串 words/chars,但在表情符号方面我遇到了麻烦。

首先,我不能简单地使用空字符拆分字符串,因为表情符号的长度通常 >= 2。

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

我发现一个 emoji regex 最有效,但现在我看到一些奇怪的肉色方块。在某些情况下,我什至看到他们出现在推特上。

这里有一支笔可以说明肉块的问题 http://codepen.io/positlabs/pen/QyEOEG?editors=011

更新------------

尝试使用 spliddit,我仍然发现肤色字符存在问题。有什么办法可以把它们粘在一起吗?

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

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

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

String.prototype.split 函数并不真正关心 UTF-16 中的 surrogate pairs,因此它天真地颠倒了各个代码单元并破坏了你的表情符号,因为 JavaScript 不会提供任何方式来处理字符串中的单个字符。

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

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

spliddit 目前无法正确地将此印地语文本拆分为 5 个字符:“अनुच्छेद”

您需要字素分离器库: https://github.com/orling/grapheme-splitter 它是 UAX-29 Unicode 标准的完整实现,甚至可以拆分最奇特的字母,表情符号只是众多用例之一