Node.js 表情解析
Node.js Emoji Parsing
我正在尝试解析传入的字符串以确定它是否包含任何非表情符号。
我已经 this great article by Mathias and am leveraging both native punycode
for the encoding / decoding and regenerate
for the regex generation. I'm also using 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-data-js
库似乎有此信息)。
要检查字符串是否包含表情符号字符,您需要测试 emoji-data.txt
中是否有任何单个字符,或者是否开始其中的序列的子字符串。
假设,如果您知道您希望 运行 进入哪些非表情符号字符,您可以通过它们的 toArray 或 split 模块使用一些 lodash 魔法,这些模块可识别表情符号。例如,如果您想查看一个字符串是否包含字母数字字符,您可以编写如下函数:
function containsAlphaNumeric(string){
return _(string).toArray().filter(function(char){
return char.match(/[a-zA-Z0-9]/);
}).value().length > 0 ? true : false;
}
我正在尝试解析传入的字符串以确定它是否包含任何非表情符号。
我已经 this great article by Mathias and am leveraging both native punycode
for the encoding / decoding and regenerate
for the regex generation. I'm also using 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-data-js
库似乎有此信息)。
要检查字符串是否包含表情符号字符,您需要测试 emoji-data.txt
中是否有任何单个字符,或者是否开始其中的序列的子字符串。
假设,如果您知道您希望 运行 进入哪些非表情符号字符,您可以通过它们的 toArray 或 split 模块使用一些 lodash 魔法,这些模块可识别表情符号。例如,如果您想查看一个字符串是否包含字母数字字符,您可以编写如下函数:
function containsAlphaNumeric(string){
return _(string).toArray().filter(function(char){
return char.match(/[a-zA-Z0-9]/);
}).value().length > 0 ? true : false;
}