编码错乱的昵称存在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);
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。