使用php+mysql存储app的用户数据,在存储emoji表情时发现存储遇到“????”乱码;
当前mysql版本为5.3;
踩坑过程:
1、首先是理解emoji表情:emoji表情详情请百科,关于emoji的几种编码方案,参考http://code.iamcal.com/php/emoji/,并且使用了github上的emoji-php也没能解决;
2、网上查到utf8_general_ci最大支持3字节,而emoji是4个字节存储,所以先将mysql表的字段和表从utf8改成utf8mb4,还是显示“????”乱码;
3、后来查到mysql字符集设置的问题,参考http://www.cnblogs.com/discuss/articles/1862248.html,将mysql character_set_client(客户端来源数据子使用的字符集) character_set_results(查询结果字符集) character_set_connection(连接层字符集)从utf8改成utf8mb4 ,还是显示“????”乱码;
4、因为app使用的mysql接口是wordpress的接口,发现wordpress网页端存储和显示emoji表情是正常的,因此调研了wordpress存储emoji表情的方法,发现mysql仍然使用了utf8编码方式,然后存储emoji表情时进行了编码;
5、接下来就是考虑emoji表情的编码方案,源码如下,参考https://zh.wpseek.com/function/wp_encode_emoji/:
<pre class="php hljs " style="box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; padding: 10px; margin-top: 0px; margin-bottom: 0px; line-height: 1.42857; word-break: break-all; word-wrap: break-word; color: rgb(34, 34, 34); border: 0px; border-radius: 4px; outline: 0px; vertical-align: baseline; clear: left; background: rgb(246, 246, 246);"><span class="hljs-function" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background: transparent;"><span class="hljs-keyword" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(133, 153, 0); background: transparent;">function</span> <span class="hljs-title" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; color: rgb(38, 139, 210); background: transparent;">wp_encode_emoji</span><span class="hljs-params" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; background: transparent;">( <span class="hljs-variable" style="box-sizing: border-box; margin: 0px; padding