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