java处理Emoji表情问题 Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x81\xF0\x9F...'...

先来一张错误的截图,为保护隐私,把sql、字段模糊

144359_3Hkt_2303218.png

当时发现这个错误的时候一脸懵逼,反复试了各种特殊字符,错误没有重现,后来点开了手机中的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表情 

如有错误,请留言指正~

转载于:https://my.oschina.net/jx457178750/blog/1542865

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值