[備忘]這是一個很少人會遇到的問題,但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

 

 

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