先来一张错误的截图,为保护隐私,把sql、字段模糊
当时发现这个错误的时候一脸懵逼,反复试了各种特殊字符,错误没有重现,后来点开了手机中的Emoji表情包,错误重现,原来是用户在输入的时候输入了Emoji表情导致。
错误原因:因为mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。
解决办法:过滤掉Emoji表情。
js中:str = str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, "");
java中:当然也要把这种字符串过滤一下,双重保险
/**
* 过滤Emoji表情
* @param str
* @return
*/
public static String filterEmoji(String str) {
if(str.trim().isEmpty()){
return str;
}
String pattern="[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]";
String reStr="";
Pattern emoji=Pattern.compile(pattern);
Matcher emojiMatcher=emoji.matcher(str);
str=emojiMatcher.replaceAll(reStr);
return str;
}
重新测试,保存成功,完美解决。
ps:回到错误的原因分析,是因为mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。那么问题来了,我们也可以更改一下myslq的编码格式,经资料查证编码utf8mb4是可以支持的,由于研发环境显示,未做测试,有兴趣的大佬可以尝试一下。
关键字:过滤emoji表情 java java 过滤掉emoji表情
如有错误,请留言指正~