JS Emoji 过滤

本贴最后更新于 1707 天前,其中的信息可能已经时移世异

想用的直接看最后一行就好

基础知识

不得不承认阮蜀黍的文笔通俗易懂

Emoji Unicode Tables

  1. Emoticons ( 1F601 - 1F64F )
  2. Dingbats ( 2702 - 27B0 )
  3. Transport and map symbols ( 1F680 - 1F6C0 )
  4. Enclosed characters ( 24C2 - 1F251 )
  5. Uncategorized
  6. Additional
    1. Additional emoticons ( 1F600 - 1F636 )
    2. Additional transport and map symbols ( 1F681 - 1F6C5 )
    3. Other additional symbols ( 1F30D - 1F567 )

转换?

只怪 JavaScript 你诞生的太早

JavaScript 只识别 UCS-2,对于 UTF-16 的 4 个编码来说,只能识别为 2 个单独的字符

友好的 ES6

ES6 对 Unicode 做了大幅增强支持

'\u{1f604}' === '\ud83d\ude04' // true

笨笨的我

然而我并不知道 '😄'.replace(/\u{1f604}/g, "") 这个的正则要怎么写,So,只能把带有辅助平面字符的 unicode 转换为 2 个单独的字符

 var unicode2UTF16 = function (unicode) {
 const h = Math.floor((unicode - 0x10000) / 0x400) + 0xD800; 
 const l = (unicode - 0x10000) % 0x400 + 0xDC00; 
 return '\\u' + h.toString(16) + '\\u' + l.toString(16);}

map

细细看下来,Emoji Unicode Tables 给的范围不按顺序出牌。Uncategorized 直接乱了爸妈都不认识,瞎眼整理:

\ud83d[\udc00-\udec5]

  • 0x1F601(\ud83d\ude01) - 0x1F64F(\ud83d\ude4f)
  • 0x1F600(\ud83d\ude00) - 0x1F636(\ud83d\ude36)
  • 0x1F680(\ud83d\ude80) - 0x1F6C0(\ud83d\udec0)
  • 0x1F681(\ud83d\ude81) - 0x1F6C5(\ud83d\udec5)
  • 0x1F400(\ud83d\udc00) - 0x1F567(\ud83d\udd67)

\ud83c[\udd70-\udf4e]

  • 0x1F30D(\ud83c\udf0d) - 0x1F3E4(\ud83c\udfe4)
  • 0x1F170(\ud83c\udd70) - 0x1F251(\ud83c\ude51)

XXXXYYYYOOOO

结果

如果要弄太花费精力,还是网上搜了下,选了个大的(最后一个)。。。

  • \ud83d[\udc00-\udec5]|\ud83c[\udd70-\udf4e]
  • \ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f]
  • \ud83c[\udc00-\udfff]|\ud83d[\udc00-\udfff]|[\u2000-\u2fff]
return str.replace(/\ud83c[\udc00-\udfff]|\ud83d[\udc00-\udfff]|[\u2000-\u2fff]/g, "")

881 天后更新

使用上速正则及 google 到的正则都无法对 https://github.com/b3log/vditor/blob/master/src/ts/emoji/allEmoji.ts 中的 1503 个 emoji 进行完全匹配,因此重写如下:

  • 1446 个 emoji 分别为 2、3、4、5、6、8、11 个字符,正则如下:
/([\u{1F300}-\u{1F5FF}][\u{2000}-\u{206F}][\u{2700}-\u{27BF}]|([\u{1F900}-\u{1F9FF}]|[\u{1F300}-\u{1F5FF}]|[\u{1F680}-\u{1F6FF}]|[\u{1F600}-\u{1F64F}])[\u{2000}-\u{206F}][\u{2600}-\u{26FF}]|[\u{1F300}-\u{1F5FF}]|[\u{1F100}-\u{1F1FF}]|[\u{1F600}-\u{1F64F}]|[\u{1F680}-\u{1F6FF}]|[\u{1F200}-\u{1F2FF}]|[\u{1F900}-\u{1F9FF}]|[\u{1F000}-\u{1F02F}]|[\u{FE00}-\u{FE0F}]|[\u{1F0A0}-\u{1F0FF}]|[\u{0000}-\u{007F}][\u{20D0}-\u{20FF}]|[\u{0000}-\u{007F}][\u{FE00}-\u{FE0F}][\u{20D0}-\u{20FF}])$/u)
  • 44 个 emoji 为 1 个字符,正则如下:
/[\u{2100}-\u{214F}]|[\u{2000}-\u{206F}]|[\u{2460}-\u{24FF}]|[\u{0080}-\u{00FF}]|[\u{2700}-\u{27BF}]|[\u{2600}-\u{26FF}]|[\u{2B00}-\u{2BFF}]|[\u{2300}-\u{23FF}]|[\u{25A0}-\u{25FF}]|[\u{3000}-\u{303F}]|[\u{3200}-\u{32FF}]|[\u{2900}-\u{297F}]|[\u{2190}-\u{21FF}]/u
  • 剩余 13 个为图片
  • Emoji
    14 引用 • 104 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    710 引用 • 1173 回帖 • 177 关注
1 操作
Vanessa 在 2019-08-15 23:07:11 更新了该帖

相关帖子

14 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • InkDP 1 评论

    881 天后更新

    厉害了

    昨晚折腾了一宿,想想还是更新下好了,方便后来者
    Vanessa
  • 其他回帖
  • iTanken

    好的,谢谢 V 姐。不过好像还是不太全,比如说这个 :rolling_on_the_floor_laughing: 172d27025c724bc799be1bc6ff3d48af-2017033111.53.31.jpg

    1 回复
  • iTanken

    V 姐知道 Emoji 的图片在哪下载不?或者能不能把 mac 自带的表情导出来成图片

    1 回复
  • Lee981265

    前几天我刚好也遇到移动端输入框禁止输入表情这个需求哈哈
    类似这类表情都可以过滤: 😀🐮⚡️✅ℹ️™️✂️💘☕️
    正则:

    /[^\u0020-\u007E\u00A0-\u00BE\u2E80-\uA4CF\uF900-\uFAFF\uFE30-\uFE4F\uFF00-\uFFEF\u0080-\u009F\u2000-\u201f\u2026\u2022\u20ac\r\n]/g;
    
    1 回复
  • 查看全部回帖