[备忘]这是一个很少人会遇到的问题,但TMD就是被我遇到了:json_encode解析emoji表情报错

解决PHP系统函数json_encode解析emoji表情抛出异常问题

小故事:

今天在测试自己做的功能时,不知道为什么就报了个错:

General error: 1366 Incorrect string value: '\xF0\x9F\x98\x83\xF0\x9F...' for column 'content' at row 1

根据以往经验分析之后还是无法定位事件发生的原因。

然后一步一步查,定位问题在代码此行:

经过测试,发现是函数:encodeJson报出的问题,此函数是我封装的一个快捷函数,方便使用而已。

此函数代码:

/**
 * desc:格式化json
 * author:
 * @param $data
 * @return false|string
 */
function encodeJson($data){
    return json_encode($data, JSON_UNESCAPED_UNICODE );
}
乍一看,也没什么问题,不就是用系统函数简单封装了一下。

json_encode($data, JSON_UNESCAPED_UNICODE );的意思就是中文不转义,保留中文字符的意思,就是你的字符串在json编码的时候会保留中文,其它的都会被转义。

看来看去就是觉得没有问题,但是!就是这里抛出了异常!

百度搜遍了都找不到问题的解决方法。。。。。。一顿焦灼之后,还得沉下心来慢慢研究,就算百度的文章千篇一律,那总还是有些蛛丝马迹可以找到的。。。。。。果不其然,一个小小的字眼被我发现了:

参考文章:http://www.lrxin.com/archives-1029.html

具体代码:

 看到这里发现作者写的不是常量,而是数字256!so,灵光一现,我TMD的256可以,那512是不是可以,因为它表示的不就是内存吗?!嗯,管它的,先改代码测试一下。

优化后:

/**
 * desc:对数据进行json编码,支持中文不转义
 * author:
 * @param $data
 * @return false|string
 */
function encodeJson($data){
    //JSON_PARTIAL_OUTPUT_ON_ERROR 512 支持表情
    //JSON_UNESCAPED_UNICODE 256 //不支持表情
    return json_encode($data, JSON_PARTIAL_OUTPUT_ON_ERROR);
}

 嗯,没错,改成512就可以支持emoji表情了!为了解决这个问题花了我一个半小时,现在已经是23:32分。本来10点可以下班的。可恶。。。。。。不过还是有收获!也值得了。

总结:

平常只用JSON_UNESCAPED_UNICODE 就可以了。如果有emoji表情就用JSON_PARTIAL_OUTPUT_ON_ERROR 常量进行编码,否则要抛出异常。

 

关机,回家。

 

END

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章