­

php json_decode 返回 null 亂碼問題

編碼錯亂的昵稱存在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);      }