制作小程序时有用到把用户微信名等信息存到数据库中作为一个练习记录的参考,但是发现当微信名里面有emoji表情时,这个表情却无法存入数据库字段中。之前用的时access数据库,字段中是可以直接存入表情的。
原因排查:
首先:我测试了一下是不是PHP程序的原因,使用post提交带有emoji表情的内容,提交的内容是正常的,post里面的内容是有emojin表情的。
接着:试着将这个数据插入数据库里面。成功插入数据库后,发现表情变成了?号显示。
到这里问题基本上就明白了,就是我的数据库不支持这个表情了。
注意!注意!注意:这是我用sql-front工具运行的结果,但是在PHP程序中运行,可能导致emoji表情后面所有的内容都无法正常存入。如:
【😤标题】emoji符号在内容最开头,插入内容直接为空,
【前面😤标题】插入内容为【前面】,
emoji表情及emoji表情后面的内容全部无法正常插入。
解决方法:
方法一:查了网上说是改变数据库字符集编码,试着将字符集改为了utfmb4。再插入一条数据看,确实表情被存入数据库了。
需要注意的是:但是即使改了数据库的字符集,PHP程序也得相应地更改字符集。要不然还是???。
定义方法为:mysqli_query($conn,"SET NAMES UTF8MB4");
方法二:将emoji表情转义,调用时再转换回去。无非就是定义两个函数,一个转义,一个反转义。
//emoji转义 function en_emoji($str){ $en_str=''; $length=mb_strlen($str,'utf-8'); for($i=0;$i=4){ $en_str.=''.rawurlencode($tmp_str).''; }else{ $en_str.=$tmp_str; } } return $en_str; } //反转义为emoji function de_emoji($str){ $de_str=preg_replace_callback('|(.*?)|',function($matches){ return rawurldecode($matches[1]); },$str); return $de_str; }
使用方法也很简单,在存入数据库时对数据进行转义,读取显示时再反转义即可。
en_emoji($str)后结果为:
读取显示时使用de_emoji($str),就可以了。
两种解决方法比较:
方法一:修改字符集,不仅要修改数据库,而且还要修改程序代码。但是怎么说呢,可能以后数据库都会升级为utf8mb4。
方法二:使用函数的方法,只需要修改程序,不需要动数据库。两个函数实现了。但是存在数据库里面的内容相比就是一些乱码的感觉。而且当我在写这篇文章时发现,因为在储存数据时使用了en_emoji,所以所有的表情都变成了转义后的代码,而当我在显示文章内容时使用反转义de_emoji,这个时侯我发现我文章中本来想表现的转义后内容也被反转义了。可以看到我上面的结果表现我只能用一张图片代替了。
结语:还是少用emoji表情吧。反正都麻烦,当然如果数据库是自己做,程序也是自己写用方法一设置utf8mb4还是比较完美的。但实话说吧,我只是在写这篇文章时用了转义函数,写完就先停用了,省得给我带来不必要的麻烦。