emoji表情在Mysql数据库中乱码问题总结
原创 2018-03-01 12:32 阅读(2226)次
最近在爬取微博数据中发现有些数据保存失败,调试后发现都是emoji表情保存到数据库后乱码造成的。我的Mysql编码都是utf8,Emoji表情占用4个字节,但是MySQL数据库UTF-8编码最多只能存储3个字节,所以乱码了。下面我总结一下我知道的处理方式:
1.保存前使用emoji的官方jar包提供的方法将表情转成代码,再保存
2.设置数据库的字符编码为支持emoji表情的字符集:utf8mb4
这种方法要使用jar包提供的方法,
引入jar包
1.保存前使用emoji的官方jar包提供的方法将表情转成代码,再保存
2.设置数据库的字符编码为支持emoji表情的字符集:utf8mb4
3.如果可以,我说如果可以。。。过滤掉吧
一、emoji表情转成代码保存
例如: :grin: 我可以存储为:smile:,:sob:存储为:cry:,等等,可以这样映射起来。这种方法要使用jar包提供的方法,
引入jar包
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>3.2.0</version>
</dependency>
然后调用api转换EmojiParser.parseToAliases(string); //将表情符号转为字符
EmojiParser.parseToUnicode(string); //将字符转为表情符号
这种做法的好处是不用修改数据库编码,重启数据库和避免了修改编码后造成其他乱码的问题,缺点也很明显,需要对数据保存前和显示都要进行转换参考:https://www.jianshu.com/p/bda2d030b0ce
二、修改数据库编码为utf8mb4
这个不多说,参考我的上一篇文章:MySQL中支持emoji表情的存储
三、如果可以,过滤掉吧
因为某种原因不想存,我们可以通过java代码来过滤掉他们,代码如下:public String replaceEmoji(String 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);
String str2 = emojiMatcher.replaceAll(reStr);
return str2;
}