[英]Node.js Emoji Parsing
我正在尝试解析传入的字符串,以确定它是否包含任何非表情符号。
我已经经历了由马蒂亚斯这篇大文章和我既充分利用本地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接收文本时也是如此)。
U+FE0F
不是组合标记,它是控制字形渲染的变体序列(请参见此答案 )。 删除此类序列可能会更改字符的外观,例如: U+231B
+ U+FE0E
(⌛︎)。
同样,表情符号序列可以由多个代码点组成。 例如, U+0032
(2)本身不是表情符号,但U+0032
+ U+20E3
(2⃣)或U+0032
+ U+20E3
+ U+FE0F
(2⃣️)是-但U+0041
+ U+20E3
(A⃣)不是。 Unicode联盟在emoji-data.txt文件中维护了emoji序列的完整列表( emoji-data-js
库似乎具有此信息)。
要检查字符串是否包含表情符号字符,您将需要测试emoji-data.txt
是否有任何单个字符,或在其中启动一个序列的子字符串。
如果假设您知道您希望遇到哪些非表情符号字符,则可以通过它们的toArray或split模块使用一点点破折号魔术,它们是表情符号感知的。 例如,如果要查看字符串是否包含字母数字字符,可以编写如下函数:
function containsAlphaNumeric(string){
return _(string).toArray().filter(function(char){
return char.match(/[a-zA-Z0-9]/);
}).value().length > 0 ? true : false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.