用户输入了emoji表情,提交的时候因为后端没有存储相应的emoji字符编码,导致报错异常。
原因: unicode定义的emoji是四个字符,对于一些之前没有考虑过emoji表情的系统来说,其获取或者展示简直就是灾难。公司用的MySQL,其utf8字符集最多支持三个字符。
解决方案
- 改变MySQL编码集设置,比如将其编码从utf8转换成utf8mb4
- 前端直接过滤掉emoji,可以用正则实现
正则一:
regemoRule : /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, // 表情匹配正则
正则二:
function replaceEmoji (val) {
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 value = val;
value = unescape(escape(value).replace(/\%uD.{3}/g, ''))
return value;
};
以上两种正则方案都是线上采用的方式。