mysql 过滤emoji表情_MySQL中emoji表情过滤

线上数据库遇到入库错误,原因是emoji表情符号导致。虽然可通过设置utf8mb4字符集存储,但为了过滤这些表情,文章提供了一个使用Java的InputFilter结合正则表达式在Android系统中过滤emoji的解决方案。
摘要由CSDN通过智能技术生成

问题描述

最近在对线上排错过程中发现很多入库时产生的错误日志,表现形态如下

Incorrectstringvalue:'\xF0\x9F\x91\x8D\xE6\x94...'forcolumn'column_x'atrow1

在查阅资料后发现这其实是一种emoji表情符号,普遍存在iOS与android系统中,而这种特殊字符合作用的Unicode 6标准来统一,采用4个bytes来存储一个emoji表情,而将这种表情不处理直接存储到MySQL5.5以下的版本会报错,当然想要MySQL存储这种字符也不困难,只需要修改数据库字符集为utf8mb4即可,但数据回传给网页或者移动客户端时则需要做兼容处理,所以我们暂时忽略这种需求,直接将其过滤掉.

解决方案

对于字符串处理,首选就是正则表达式去处理,而在android系统中可以自定义InputFilter去过滤需要处理掉的字符串,代码如下

nputFilteremojiFilter=newInputFilter(){

@Override

publicCharSequencefilter(CharSequencesource,intstart,intend,Spanneddest,intdstart,

intdend){

}

};

随后我查阅了emoji的wikipedia与Github,从中提取出表情的一个大概unicode范围,由于Java可以直接对unicode进行匹配,这样我们可以很省事直接写出Pattern即可,代码如下

InputFilteremojiFilter=newInputFilter(){

Patternemoji=Pattern.compile(

"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",

Pattern.UNICODE_CASE|Pattern.CASE_INSENSITIVE);

@Override

publicCharSequencefilter(CharSequencesource,intstart,intend,Spanneddest,intdstart,

intdend){

MatcheremojiMatcher=emoji.matcher(source);

if(emojiMatcher.find()){

return"";

}

returnnull;

}

};

基本上这样就能过滤掉emoji表情了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值