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);      }