一、问题描述,公司开发的应用中,有些内容是用户可以自己输入的,比如文章的评论,客户模块的客户姓名,客户备注等等,这些内容用户都是可以自己随意输入的,在使用的过程中发现,当客户输入emoji表情的时候,前端都显示成了????,查看数据库,发现数据库中存储的内容也是????。
二、问题分析
存储表情符号出现????,很容易想到,出现问号,肯定是乱码了,既然是乱码那么肯定是编码格式问题,那么我们就去查看什么地方的编码格式有问题。
首先要确定的是数据库的编码格式,数据库如果编码不对,肯定是不行的。由于我使用的是mysql数据库,调查的过程中,发现mysql确实是有编码问题的。先理解几个名词,UNICODE,UTF-8,可以百度,暂时不做过多解释。其中可以简要说下,UNICODE是通过4个字节存储信息,所以理论上是所有的字符UNICODE都可以编码出来,UTF8 就是实现UNICODE编码的一种实现,但是mysql在存储UTF8的编码时,使用的是3个字节,而emoji表情是需要4个字节才可以存储,所以存储表情的时候就出现了乱码即?,为了解决这个问题,mysql又增加了一个编码格式utf8mb4,这个编码就是传统意义的UTF8了。所以很明显
最终是在mybaties中增加了一句执行语句,修改了编码格式:
connectInitSqls=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;设置数据库连接中使用的编码格式