PHP提供了一个json_encode函数,如果变量里含有中文时,json_encode会将中文转为unicode格式,但是如何将已经转为unicode格式的中文转换为中文呢?
前段时间就遇到了这样的问题,在将一些信息以json_encode之后存储到数据库之后,用php从数据库读出编码之后的数据直接进行json_decode,发现中文仍然是unicode编码,
[0] => Array
(
[key] => \u767e\u8d27\u7c7b\uff08\u767e\u8d27\u7c7b\u5176\u4ed6\uff09\u666e\u901a\u4f1a\u5458
[vip] => 2.6%
[not_vip] => 1.7%
)
由于json_decode之后已经是数组了,所以不能直接再json_decode,因此考虑将key指向的unicode编码串取出来之后,再进行解码,但是取出来之后直接进行json_decode确返回空,这是为什么呢?
分析PHP支持的两种数组,一种是只保存“值”(value)的索引数组(indexedarray),另一种是保存”名值对“(name/value)的关联数组(associate array)。两种数组json_encode之后结果是不一样的。
对索引数组进行json_encode:
$arr = Array('a', 'b', 'c');
echo json_encode($arr);
结果为:
["a","b","c"]
对关联数组进行json_encode:
$arr = Array{
'1' => 'a',
'2' => 'b',
'3' => 'c'
};
echo json_encode($arr);
结果为:
{"1":"a","2":"b","3":"c"}
由上可见,关联数组和索引数组json_encode之后结果是不一样的,再回到本文前面的问题,就很清楚了,key所对应的字符串不是json格式,所以json_decode会返回空,那如何处理呢?
很明显,key对应的字符串这里应该先转成索引数组json_encode之后的格式,再进行json_decode解码即可。下面自己封装一个json_encode函数:
function my_json_decode($str)
{
if(!$str)
{
return $str;
}
$res = json_decode($str);
if($res)
{
return $res;
}
$str = '[“' . $str . '”]';
return json_decode($str);
}
将json_decode替换成自己封装的my_json_decode之后,即可正常解析得到结果!