微信nickname中包含emoji的问题

问题原因:

微信昵称是可以添加emoji表情的,当我们保存带有emoji的昵称时,mysql数据库会报错

原因是我们使用mysql数据库存储格式一般是utf8,而mysql的“utf8”实际上不是真正的 UTF-8。

“utf8”只支持每个字符最多三个字节,而真正的 UTF-8 是每个字符最多四个字节。

mysql的“utf8mb4”是真正的“UTF-8”。

而emoji恰恰就是四个字节,所以保存的时候会报错。

解决办法:

1.把mysql数据库格式utf8改成utf8mb4

将my.ini(win)文件配置修改,如下

[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'

发现还有两个问题会继续导致字符不兼容的问题:

1.JDBC连接串的问题,有些项目在jdbc连接串里指定了编码,例如:

jdbc:mysql://localhost/mydb?characterEncoding=UTF-8

2.字符集修改之后要将相关表结构中的表的字符集以及表中字段的字符集也修改为utf8mb4


2.使用一个轻量级框架emoji-java

github地址:https://github.com/vdurmont/emoji-java

这个思路是将emoji按照框架里保存的类似枚举类型的emoji进行对比,如果匹配到了,就将emoji转成:cry:

类似这种格式的字符串保存到数据库中,拿的时候再去匹配,如果包含这种格式的Aliases,就解析成emoji

但是这又有两个问题,1.生产环境中可能会有各种的emoji,如果emoji-java框架没有这种emoji,数据库还是会报错

2.小概率如果有字段带有:cry:这种格式,会将他转成emoji


总结:如果条件允许,直接改数据库格式,最好在一开始就把数据库设置成 

          utf8mb4这种格式的, mysql中utf8不是真正的utf-8, utf8mb4才是真正的utf-8 

          有博客说这是mysql的一个bug但是一直没有修复,不知道这种说法正不正确,

           方法二可以暂时解决问题,但是会有坑                

你可能感兴趣的:(微信nickname中包含emoji的问题)