Node.js Emojiparsing

我试图parsing一个传入的string,以确定它是否包含任何非表情符号。

我已经阅读了Mathias撰写的这篇伟大的文章,并利用本地punycode进行编码/解码,并为正则expression式生成regenerate生成。 我也使用EmojiData来获取我的emojis字典。

所有人都说,某些表情符号仍然是令人讨厌的小丑,并拒绝匹配。 对于某些表情符号,我继续得到一对代码点。

 // Example of a single code point: console.log(punycode.ucs2.decode('💩')); >> [ 128169 ] // Example of a paired code point: console.log(punycode.ucs2.decode('⌛️')); >> [ 8987, 65039 ] 

Mathias在他的文章中提到了这个(并给出了punycode的例子),但即使使用他的例子,我也得到了一个不正确的回答:

 function countSymbols(string) { return punycode.ucs2.decode(string).length; } console.log(countSymbols('💩')); >> 1 console.log(countSymbols('⌛️')); >> 2 

检测一个string是否包含所有emojis的最好方法是什么? 这是为了一个概念的certificate,所以解决scheme可以像需要那样的蛮力。

—更新—

上面我讨厌的表情多一点背景。

这些在视觉上是相同的,但实际上不同的unicode值(第二个来自上面的例子):

 ⌛ // \u231b ⌛️ // \u231b\ufe0f 

第一个很好,第二个不好。 不幸的是,第二个版本是iOS似乎使用的(如果从iMessage中复制和粘贴,则会得到第二个版本,并且在从Twilio接收文本时也是如此)。

U+FE0F不是组合标记,它是控制字形渲染的变体序列(请参阅此答案 )。 删除这些序列可能会改变字符的外观,例如: U+231B + U+FE0E (⌛︎)。

另外,可以从多个代码点制作表情符号序列。 例如, U+0032 (2)本身不是表情符号,但是U+0032 + U+20E3 (2⃣)或U+0032 + U+20E3 + U+FE0F (2⃣) U+20E3 (A⃣)不是。 Unicode联合体在emoji-data.txt文件中保存了一个完整的表情符号列表( emoji-data-js库似乎有这个信息)。

要检查一个string是否包含表情符号,您需要testingemoji-data.txt是否有任何单个字符,或者是否为其中的某个序列启动子string。

对于那些感兴趣的人,我写了一个深入的处理Javascript的表情符号的方法 。 对于我的问题,接受的答案仍然是最有效的。

如果假设你知道你期望遇到什么非表情符号,你可以通过toArray或split模块使用一点点魔法,这些模块是表情符号。 例如,如果您想查看一个string是否包含字母数字字符,您可以编写如下所示的函数:

 function containsAlphaNumeric(string){ return _(string).toArray().filter(function(char){ return char.match(/[a-zA-Z0-9]/); }).value().length > 0 ? true : false; }