开发过php代码的程序员都知道,php自带的json_encode函数只能对 utf-8编码数据进行json转换,gbk下中文编码会丢失,变成null值。如何兼容gbk编码,并且utf-8转换后,数据长度会变大,如汉字“你好”会转换为“\u4f60\u597d”,长度有6个变成12。大量文字下,转换后数据会变得更多,占用更多带宽资源。下面通过自定义函数来避免上面两个问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function _json_encode($val)
{
    if (is_string($val)) return '"'.str_replace(array('\\',"\r","\n",'"','/',"\t","\f"),array('\\\\','\r','\n','\\"','\/','\t','\f'),$val).'"';
    if (is_numeric($val)) return $val;
    if ($val === null) return 'null';
    if ($val === true) return 'true';
    if ($val === false) return 'false';
 
    $assoc = false;
    $i = 0;
    foreach ($val as $k=>$v){
        if ($k !== $i++){
            $assoc = true;
            break;
        }
    }
    $res array();
    foreach ($val as $k=>$v){
        $v = _json_encode($v);
        if ($assoc){
            $k '"'.addslashes($k).'"';
            $v $k.':'.$v;
        }
        $res[] = $v;
    }
    $res = implode(','$res);
    return ($assoc)? '{'.$res.'}' '['.$res.']';
}
//--通过原生 json_encode及自定义函数来比较下
$arr=array('name'=>'你好','age'=>31);
echo json_encode($arr);//输出{"name":"\u4f60\u597d","age":21},长度为32
echo _json_encode($arr);//输出{"name":"你好","age":21},长度为26
$json_str=_json_encode($arr);
var_dump(json_decode($json_str,true));
echo '<div></div><script>var data='.$json_str.';document.getElementById("messid").innerHTML=data.name;</script>';

通过自定义函数实现后,输出值传递为js变量或php json_decode处理都没问题,都能正确解析出来。唯一注意的地方就是 html页面编码要跟php输出编码要一致就行了。

相关评论(0)
您是不是忘了说点什么?

友情提示:垃圾评论一律封号...

还没有评论,快来抢沙发吧!