前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php json_decode 返回 null 乱码问题

php json_decode 返回 null 乱码问题

原创
作者头像
shirishiyue
发布2020-01-01 17:33:16
3.3K0
发布2020-01-01 17:33:16
举报
文章被收录于专栏:全栈码全栈码

编码错乱的昵称存在json字符串里,php调用json_decode(xxx, true) 失败,返回null的问题。

比如,下面的nick:

代码语言:php
复制
		//用其他语言进行 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

工具函数代码如下:

代码语言:javascript
复制
    //正则替换乱码昵称。匹配模式:"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);
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档