报错日志:
报错原因:
数据中含有Emoji表情字符,通常情况,Mysql数据编码格式为“utf-8”,对于汉字来说足够;Mysql中utf8占3个字节,但是,3个字节对于表情符号是不够的,需4个字节;此时使用utf8,会出现‘\xF0\x9F\x8D\x83\xF0\x9F’的问题。
解决办法:
-
1.修改Mysql数据库编码
utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
第一步:修改mysql的配置文件mysql/bin/my.ini, 添加如下内容
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect=‘SET NAMES utf8mb4’
第二步:重启数据库
linux输入命令:service mysql restart
windows输入命令:net stop mysql 和 net start mysql
第三步:修改数据表的编码为utf8mb4
在改动的数据库那,执行查询语句:ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8mb4;
- 2.代码中对4个字节的字符进行转换
转换效果:
代码:
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* @author 在下令狐
* @date 2020/11/3
**/
public class EmojiTransferUtil {
/**
* @Description 将字符串中的emoji表情转换成可以在utf-8字符集数据库中保存的格式(表情占4个字节,需要utf8mb4字符集)
*/
public static String emojiEncode(String str) throws UnsupportedEncodingException {
String patternString = "([\\x{10000}-\\x{10ffff}\ud800-\udfff])";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
try {
matcher.appendReplacement(
sb,
"[["
+ URLEncoder.encode(matcher.group(1),
"UTF-8") + "]]");
} catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
}
matcher.appendTail(sb);
return sb.toString();
}
/**
* @Description 还原utf8数据库中保存的含转换后emoji表情的字符串
*/
public static String emojiDecode(String str) throws UnsupportedEncodingException {
String patternString = "\\[\\[(.*?)\\]\\]";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(str);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
try {
matcher.appendReplacement(sb, URLDecoder.decode(matcher.group(1), "UTF-8"));
} catch(UnsupportedEncodingException e) {
throw e;
}
}
matcher.appendTail(sb);
return sb.toString();
}
public static void main(String[] args) throws UnsupportedEncodingException {
System.out.println("decode emoji " + emojiDecode("[[%F0%9F%8D%80]]"));
System.out.println("encode emoji " + emojiEncode("\uD83C\uDF40"));
}
}