Node.js表情符号解析

the*_*ott 8 javascript unicode punycode node.js emoji

我正在尝试解析传入的字符串以确定它是否包含任何非emojis.

我已经阅读了Mathias的这篇精彩文章,并且正在利用本机punycode编码/解码和regenerate正则表达式生成.我也在用EmojiData来获取我的表情符号字典.

尽管如此,某些表情符号仍然是讨厌的小虫子并拒绝匹配.对于某些表情符号,我继续获得一对代码点.

// 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 ]
Run Code Online (Sandbox Code Playgroud)

Mathias在他的文章中触及了这一点(并给出了一个解决这个问题的punycode的例子)但是即使使用他的例子我得到的答案也是错误的:

function countSymbols(string) {
  return punycode.ucs2.decode(string).length;
}
console.log(countSymbols(''));
>> 1
console.log(countSymbols('??'));
>> 2
Run Code Online (Sandbox Code Playgroud)

检测字符串是否包含所有表情符号的最佳方法是什么?这是为了概念验证,因此解决方案可以根据需要进行强力实施.

---更新---

上面我讨厌的表情符号的更多背景.

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

? // \u231b

?? // \u231b\ufe0f
Run Code Online (Sandbox Code Playgroud)

第一个很好,第二个不好.不幸的是,第二个版本是iOS似乎使用的(如果你从iMessage复制和粘贴你获得第二个版本,当从Twilio接收文本时,同样的事情).

一二三*_*一二三 4

U+FE0F不是一个组合标记,它是控制字形渲染的变体序列(请参阅此答案)。删除此类序列可能会更改字符的外观,例如:U+231B+ U+FE0E(\xe2\x8c\x9b\xef\xb8\x8e)。

\n\n

此外,表情符号序列可以由多个代码点组成。例如,U+0032(2) 本身不是表情符号,但U+0032+ U+20E3(2\xe2\x83\xa3) 或U+0032+ U+20E3+ U+FE0F(2\xe2\x83\xa3\xef\xb8\x8f) 是\xe2\x80\x94,但U+0041+ U+20E3(A\xe2\x83\xa3) 不是。表情符号序列的完整列表由 Unicode 联盟维护在emoji-data.txtemoji-data-js文件中(该库似乎有此信息)。

\n\n

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

\n