php json_decode 返回 null 亂碼問題
- 2020 年 1 月 1 日
- 筆記
編碼錯亂的昵稱存在json字元串里,php調用json_decode(xxx, true) 失敗,返回null的問題。
比如,下面的nick:
//用其他語言進行 urldecode -> jsondecode 後如下(php這樣不行): { "uid": "jh4Er1fQIioZzONM8cLVJg", "nick": "五行缺錢", "goods": "", "user_source": 3, "winning_time": 1577863823, "award_status": 1 }, { "uid": "zumEu93Z8CqYTXRGjHo", "nick": "���հ���", "goods": "", "user_source": 3, "winning_time": 1577863823, "award_status": 1 }
一個解決思路,替換掉這些亂碼的nick。
很不好解決的一個問題:怎麼知道亂碼?
思路:就按照json_decode為標準,能解出來的,就不是亂碼,反之就是亂碼。
具體實現:
1、正則匹配到所有的:"nick":"xxx", 這種模式
2、取出 xxx,構造json字元串
3、調用 json_decode 解析,判斷xxx是否合法。
4、不合法的,替換xxx為空,得到不含亂碼的nick
工具函數程式碼如下:
//正則替換亂碼昵稱。匹配模式:"nick":"xxx",(需要自己確定) public function replaceBadcodeNickInResInfo($res_info, $replace="") { $tmp1 = urldecode($res_info); $r = preg_match_all('|"nick":"(.+)",|iU', $tmp1, $matches); //i表示區分大小寫,U表示非貪婪模式,("nick":"xxx",)這種模式 if(!empty($r) && !empty($matches[0]) && !empty($matches[1])){ //逐個對昵稱進行編解碼嘗試,把解碼失敗的亂碼的昵稱去掉 foreach($matches[1] as $key => $value){ $madeJsonString = '{"a":"'.$value.'"}'; $dr = json_decode($madeJsonString, true); if(empty($dr)){ //echo "find bad nick: ".$value."n"; //替換原字元串里的這個亂碼的 $tmp1 = str_replace($matches[0][$key], '"nick":"'.$replace.'",', $tmp1); } } } return json_decode($tmp1, true); }