最近在做微信相关的项目,自然绕不过 Emoji 表情这个问题,简单的存储直接报错: Cause: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80' for column 'data' at row 1
这个错误的原因是由于字符集不支持造成的,因为 Emoji 表情是4个字节,而 MySql的 utf8 编码最多3个字节,所以导致数据插入失败。
修改 MySql 以支持 Emoji 表情
如果想让 MySql 直接存储 Emoji 表情,则需要字符集为 utf8mb4,这里需要注意的是,修改字符集不仅仅需要修改这个字段的字符集,而是 database、table、column 三者的字符集全部要修改。切换中主要考虑的是需要对 MySql 进行重启,如果有线上服务在运行,这个方法就比较麻烦,有需要的可以参考这篇文章 mysql/Java服务端对emoji的支持
通过 Java 代码不修改 MySql 以支持 Emoji 表情
使用 GitHub 上面的一个项目 emoji-java
这个项目的大致意思就是,给每个 Emoji 表情一个代替的字符(这里叫别名,aliases),存入之前,先把表情转换成别名,再存入 MySql 中,而从 MySql 中读取的时候也通过这么一个过程将别名再转换成 Emoji 表情。
引入依赖
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
</dependency>
将 Emoji 转换为别名
String result = EmojiParser.parseToAliases(data);
将别名转换为 Emoji
String data = EmojiParser.parseToUnicode(result);
案例 Demo
在测试中,我们就可以发现:
- 保存的时候
测试😀
已经被转换成了测试:grinning:
,而存入 MySql 中正常 -
读取的时候
测试:grinning:
又被转换回了测试😀
,读取也可以正常处理
其他 API
该项目还提供了一些其他 API 以供使用,具体请查阅 GitHub 项目:emoji-java
发表评论
沙发空缺中,还不快抢~