【问题标题】:Node.js Emoji ParsingNode.js 表情符号解析
【发布时间】:2015-12-22 15:17:21
【问题描述】:

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

我已经使用了this great article by 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 ]

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 的文本时,同样的事情)。

【问题讨论】:

  • 所以看起来组合标记(第二个示例中额外的 unicode 位)是这里的绊脚石。我正在研究如何最好地从我的字符串中删除这些元素。
  • 如果有人遇到过类似的用例,我将这一切打包到一个 npm 模块中:github.com/scottlabs/emojiExists

标签: javascript node.js unicode emoji punycode


【解决方案1】:

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+@ 987654333@ (A⃣) 不是。完整的表情符号序列列表由 Unicode Consortium 在emoji-data.txt 文件中维护(emoji-data-js 库似乎有此信息)。

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

【讨论】:

  • 感谢您的帮助。我现在首先寻找成对的代码点,然后是单个代码点,这适用于我的用例。
【解决方案2】:

如果假设您知道预期会遇到哪些非表情符号字符,则可以通过它们的 toArray 或拆分模块使用一点 lodash 魔法,这些模块可以识别表情符号。例如,如果您想查看一个字符串是否包含字母数字字符,您可以编写如下函数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2021-11-04
    • 2017-08-24
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    相关资源
    最近更新 更多