原文来自:
https://www.cnblogs.com/tsjTSJ/p/7065544.html
最全最详细的用JS过滤Emoji表情的输入
在前端页面开发过程中,总会碰到不允许输入框输入emoji表情的需求,我的思路是通过编码用正则匹配表情,然后将其替换为空字符创。但是问题也是显而易见的,完整的编码集是什么呢?查阅了官方文档,发现上面并没有给出想要的答案。并且很多emoji表情除了主编码还有副编码(这是我给取的名字),举个例子:
\uD83C\uDC00是一个表情,\uD83C\uDC00\u200D又是一个表情,我把\uD83C\uDC00称为主编码,\u200D称为副编码(或者衍生编码,反正意思理解了就行)。
最终解决方案如下:
var regStr = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig; var org_val = $("input").val(); if(regStr.test(org_val)){ $("#input").val(org_val.replace(regStr,"")); }
上面的正则可以匹配iOS10.2.1及之前的全部emoji表情,Android的表情因为比较多,如上面的正则有遗漏,可自行补充。测试一个表情的编码方法如下:
<input type="text" /> var org_val = $("input").val(); console.log(escape(org_val)); //escape得到%uD83C%u.........格式的编码,可对应成\u...格式
扩展阅读:
1、escape 与encodeURI 的区别 ;
Differences between encodeURI, encodeURIComponent, and escape:Unicode characters
As a simple example of Unicode (non-ASCII) characters, the table below shows the URL encodings for part of the Cyrillic subset of the Unicode character set (\u0410 thru \u042F). Note that the same Unicode character may produce the encoding Importantly, the functions chr escape(chr) encodeURI(chr) encodeURIComponent(chr) А %u0410 %D0%90 %D0%90 Б %u0411 %D0%91 %D0%91 В %u0412 %D0%92 %D0%92 Г %u0413 %D0%93 %D0%93 Д %u0414 %D0%94 %D0%94 Е %u0415 %D0%95 %D0%95 Ж %u0416 %D0%96 %D0%96 З %u0417 %D0%97 %D0%97 И %u0418 %D0%98 %D0%98 Й %u0419 %D0%99 %D0%99 К %u041A %D0%9A %D0%9A Л %u041B %D0%9B %D0%9B М %u041C %D0%9C %D0%9C Н %u041D %D0%9D %D0%9D О %u041E %D0%9E %D0%9E П %u041F %D0%9F %D0%9F Р %u0420 %D0%A0 %D0%A0 С %u0421 %D0%A1 %D0%A1 Т %u0422 %D0%A2 %D0%A2 У %u0423 %D0%A3 %D0%A3 Ф %u0424 %D0%A4 %D0%A4 Х %u0425 %D0%A5 %D0%A5 Ц %u0426 %D0%A6 %D0%A6 Ч %u0427 %D0%A7 %D0%A7 Ш %u0428 %D0%A8 %D0%A8 Щ %u0429 %D0%A9 %D0%A9 Ъ %u042A %D0%AA %D0%AA Ы %u042B %D0%AB %D0%AB Ь %u042C %D0%AC %D0%AC Э %u042D %D0%AD %D0%AD Ю %u042E %D0%AE %D0%AE Я %u042F %D0%AF %D0%AF Note also that for many Unicode characters, chr escape(chr) encodeURI(chr) encodeURIComponent(chr) ≠ %u2260 %E2%89%A0 %E2%89%A0 ≡ %u2261 %E2%89%A1 %E2%89%A1 ≢ %u2262 %E2%89%A2 %E2%89%A2 ≣ %u2263 %E2%89%A3 %E2%89%A3 ≤ %u2264 %E2%89%A4 %E2%89%A4 ≥ %u2265 %E2%89%A5 %E2%89%A5(See Mathematical and Special Symbols for more examples.) |
简单的来说就是 一个Unicode 编码的两种格式
来自:http://www.javascripter.net/faq/escape-encodeuri-unicode.htm
二、其他方式:
def filter_emoji(desstr,restr=''):
''''' 过滤表情 '''
try:
co = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') ###一般emoji表情还有副字符,这里只匹配到了2个字符
return co.sub(restr, desstr)
三。这里提供一个链接,fb,twitter的emoji合集:
https://emojipedia.org/facebook/