解決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