the*_*ott 8 javascript unicode punycode node.js emoji
我正在尝试解析传入的字符串以确定它是否包含任何非emojis.
我已经阅读了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 ]
Run Code Online (Sandbox Code Playgroud)
Mathias在他的文章中触及了这一点(并给出了一个解决这个问题的punycode的例子)但是即使使用他的例子我得到的答案也是错误的:
function countSymbols(string) {
return punycode.ucs2.decode(string).length;
}
console.log(countSymbols(''));
>> 1
console.log(countSymbols('??'));
>> 2
Run Code Online (Sandbox Code Playgroud)
检测字符串是否包含所有表情符号的最佳方法是什么?这是为了概念验证,因此解决方案可以根据需要进行强力实施.
---更新---
上面我讨厌的表情符号的更多背景.
这些在视觉上是相同的,但实际上是不同的unicode值(第二个来自上面的例子):
? // \u231b
?? // \u231b\ufe0f
Run Code Online (Sandbox Code Playgroud)
第一个很好,第二个不好.不幸的是,第二个版本是iOS似乎使用的(如果你从iMessage复制和粘贴你获得第二个版本,当从Twilio接收文本时,同样的事情).
这U+FE0F
不是一个组合标记,它是控制字形渲染的变体序列(请参阅此答案)。删除此类序列可能会更改字符的外观,例如:U+231B
+ U+FE0E
(\xe2\x8c\x9b\xef\xb8\x8e)。
此外,表情符号序列可以由多个代码点组成。例如,U+0032
(2) 本身不是表情符号,但U+0032
+ U+20E3
(2\xe2\x83\xa3) 或U+0032
+ U+20E3
+ U+FE0F
(2\xe2\x83\xa3\xef\xb8\x8f) 是\xe2\x80\x94,但U+0041
+ U+20E3
(A\xe2\x83\xa3) 不是。表情符号序列的完整列表由 Unicode 联盟维护在emoji-data.txtemoji-data-js
文件中(该库似乎有此信息)。
要检查字符串是否包含表情符号字符,您需要测试 中是否有任何单个字符emoji-data.txt
,或者是否为其中的序列启动子字符串。
归档时间: |
|
查看次数: |
5293 次 |
最近记录: |