javascript - Node.js 表情解析

标签 javascript node.js unicode emoji punycode

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

我已经完成了 this great article by Mathias并利用 native punycode 进行编码/解码和 regenerate对于正则表达式生成。我也在使用 EmojiData获取我的表情符号字典。

话虽如此,某些表情符号仍然是讨厌的小 bug 并且拒绝匹配。对于某些表情符号,我继续获得一对代码点。

// 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

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

---更新---

关于我上面讨厌的表情符号的更多背景信息。

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

⌛ // \u231b

⌛️ // \u231b\ufe0f

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

最佳答案

U+FE0F 不是组合标记,它是控制字形呈现的变化序列(参见 this answer )。删除此类序列可能会改变字符的外观,例如:U+231B+U+FE0E (⌛︎)。

此外,表情符号序列可以由多个 代码点组成。例如,U+0032 (2) 本身不是表情符号,而是 U+0032+U+20E3 (2⃣) 或 U+0032+U+20E3+U+FE0F (2⃣️) 是——但是U+0041+U+20E3 (A⃣) 不是。 emoji-data.txt 中维护了完整的表情符号序列列表。 Unicode 联盟的文件(emoji-data-js 库似乎有此信息)。

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

关于javascript - Node.js 表情解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771183/

相关文章:

unicode - 使用awk去除字节顺序标记

javascript - jquery动态定位

javascript - 如何使用 webpack import 在子目录中加载?

node.js - 字符串数组上的 MongoDB 全文搜索

javascript - 异步/等待与 Promise

java - 使用 Unicode 字符集显示多米诺骨牌

javascript - HTML5 Canvas 中的渐变位置

javascript - 如果没有要显示的 child ,Kendo UI treeview 会删除 kendo ui treeview 中的展开箭头 - 无法正常工作

debugging - Mongoose 调试日志到单独的文件

python - 从文件文本中删除非 ASCII 字符