繁体   English   中英

Node.js表情符号解析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM