项目中需要实现聊天功能,需要满足emoji表情的保存。在实现过程中也也遇到很多坑,找了更多博客才解决了问了,大概整理了下,需要的步骤。
实现我找到了两种方法:
方法一:修改字符编码把utf8修改为utf8mb4(用sqlyog工具演示)
使用条件:
MySQL版本不能小于5.5.3
mysql connector5.1.13为最低要求
1、修改数据库字符集
sql命令:(****表示你自己的数据库名称)
ALTER DATABASE **** CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
2、修改表字符集
sql命令:(****表示你自己的表名称)
ALTER TABLE **** CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3、修改你要保存emoji表情的字段字符集
sql命令:(****表示你自己的表名称,####表示字段名)
ALTER TABLE **** CHANGE #### VARCHAR(225) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
4、修改数据库配置
打开mysql的配置文件my.ini,添加以下信息
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
character-set-client-handshake = false
[client]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
5、重启MySQL
6、jdbcurl中不要配置characterEncoding=UTF-8,我配置了一致保存不了
mysql.jdbcurl=jdbc:mysql://127.0.0.1:3306/dolphin_v3?zeroDateTimeBehavior=convertToNull&useUnicode=true
7、若果使用mybatis还需要配置连接池
https://blog.csdn.net/z69183787/article/details/71196197
方法二:字Java代码代码中把utf8mb4字符的emoji转化成utf8保存到MySQL
/* 将emoji标签转换成utf8字符集保存进数据库
* @param str
* @return
*/
public String emojiConvert(String str) {
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();
}
/**
* 还原utf8数据库中保存的含转换后emoji表情的字符串
*
* @param str
* @return
*/
public String emojiRecovery(String str) {
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) {
return "";
}
}
matcher.appendTail(sb);
return sb.toString();
}
这个两个方法在网上找的,找不到原地址了。
三、展示效果