开发过php代码的程序员都知道,php自带的json_encode函数只能对 utf8编码数据进行json转换,gbk下中文编码会丢失,变成null值。如何兼容gbk编码,并且utf8转换后,数据长度...
开发过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>';