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; }