开发过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输出编码要一致就行了。
发表评论 取消回复