【发布时间】: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