php技术博客

记录php相关学习知识及开发示例、疑难问题等

[原创] 自定义函数实现php处理gbk编码下json_encode功能

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

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输出编码要一致就行了。

示例源码打包下载地址: json_encode替代函数.zip
版权声明:本站原创文章,转载请注明出处:php技术博客,否则将追究法律责任