安全地拆分表情符号
Splitting emoji, safely
我正在尝试将一个字符串拆分为单个字符串 words/chars,但在表情符号方面我遇到了麻烦。
首先,我不能简单地使用空字符拆分字符串,因为表情符号的长度通常 >= 2。
"".split("")
["�", "�"]
我发现一个 emoji regex 最有效,但现在我看到一些奇怪的肉色方块。在某些情况下,我什至看到他们出现在推特上。
这里有一支笔可以说明肉块的问题
http://codepen.io/positlabs/pen/QyEOEG?editors=011
更新------------
尝试使用 spliddit,我仍然发现肤色字符存在问题。有什么办法可以把它们粘在一起吗?
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 标准的完整实现,甚至可以拆分最奇特的字母,表情符号只是众多用例之一
我正在尝试将一个字符串拆分为单个字符串 words/chars,但在表情符号方面我遇到了麻烦。
首先,我不能简单地使用空字符拆分字符串,因为表情符号的长度通常 >= 2。
"".split("")
["�", "�"]
我发现一个 emoji regex 最有效,但现在我看到一些奇怪的肉色方块。在某些情况下,我什至看到他们出现在推特上。
这里有一支笔可以说明肉块的问题 http://codepen.io/positlabs/pen/QyEOEG?editors=011
更新------------
尝试使用 spliddit,我仍然发现肤色字符存在问题。有什么办法可以把它们粘在一起吗?
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 标准的完整实现,甚至可以拆分最奇特的字母,表情符号只是众多用例之一