小编第一次碰到这个问题是在做微信开发认证的时候,微信认证获取用户昵称的时候,当获取到带emoji表情的时候,小编发现后台显示的是乱码或者是显示为NULL(前台展示为游客)
既然碰到,解决了,就简单给大家讲一下吧。
首先是从 emoji表情 的编码说起
无论是字符或者图片以及其他什么东东,都是以二进制比特流的存进计算机,那么如何这些二进制比特流以图片或者视频或者文字的形式展现给计算机使用者。记得黑客帝国里一个场景:当别人问为什么要看电脑监控的时候全部都是二进制时候,那逗比说:”电脑解码速度太慢,只能看二进制码流,不过,在我眼里,这些跟视频没什么两样“。一直觉得这货很屌炸天嘛。装X有格调。哈哈哈。不扯淡。进入正题
当二进制转换成用户所熟悉的图片,文字形式的时候,例如文字,需要的是一个编码标准,所以各种各样的字符集标准应孕而生,字符集规定了二进制和文字的转换关系。 说了那么多我们来看一个实际例子,下面就是屌这个字在各种编码下的十六进制和二进制编码结果,怎么样有没有一种很屌的感觉?
字体编码是有了,但是 随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现。它几乎涵盖了各个国家语言可能出现的符号和文字,并将为他们编号。详见:Unicode on Wikipedia。Unicode的编号从0000开始一直到10FFFF共分为16个Plane,每个Plane中有65536个字符。而UTF-8则只实现了第一个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库,这也造成了它在某些场景下对于特殊字符的处理困难。emoji表情就是之一。
emoji表情
emoji表情采用的是 Unicode编码,Emoji就是一种在Unicode位于\u1F601-\u1F64F区段的字符。这个显然超过了目前常用的UTF-8字符集的编码范围\u0000-\uFFFF。所以这也就导致了小编开头出现的问题, 原因是什么呢 :一般数据库采用的数据库编码是utf-8。而且emoji支持的编码 utf8m4 在 mysql5.5 之后才支持,emoji表情所在的编码范围。utf-8编码根本不支持,所以也就导致了开头的乱码。
知道了原因,解决就相对比较简单了,只要把数据库的编码更改就可以了,添加emoji表情的支持。更改编码为 utf8mb4
| character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | collation_connection | utf8mb4_general_ci | | collation_database | utf8mb4_general_ci | | collation_server | utf8mb4_general_ci |
另外一种方法就是在微信认证的时候,把微信名称中的emoji表情字符过滤掉。