http://blog.csdn.net/fdipzone/article/details/28766357
php5.4 以后,json_encode增加了JSON_UNESCAPED_UNICODE , JSON_PRETTY_PRINT 等几个常量参数。使显示中文与格式化更方便。
多层中文乱码解决:
<?php
调用:
header('content-type:application/json;charset=utf8');
$arr =array(
'status'=> true,
'errMsg'=> '',
'member'=>array(
array(
'name'=> '李逍遥',
'gender'=> '男'
),
array(
'name'=> '赵灵儿',
'gender'=> '女'
)
)
);
echo jsonFormat($arr);
/** Json数据格式化
* @param Mixed $data 数据
* @param String $indent 缩进字符,默认4个空格
* @return JSON
*/
function jsonFormat($data, $indent=null){
//对数组中每个元素递归进行urlencode操作,保护中文字符
array_walk_recursive($data,'jsonFormatProtect');
//json encode
$data= json_encode($data);
//将urlencode的内容进行urldecode
$data= urldecode($data);
//缩进处理
$ret= '';
$pos= 0;
$length= strlen($data);
$indent= isset($indent)?$indent :' ';
$newline= "\n";
$prevchar= '';
$outofquotes= true;
for($i=0; $i<=$length; $i++){
$char= substr($data, $i, 1);
if($char=='"' && $prevchar!='\\'){
$outofquotes= !$outofquotes;
}elseif(($char=='}' || $char==']') && $outofquotes){
$ret.= $newline;
$pos--;
for($j=0; $j<$pos; $j++){
$ret.= $indent;
}
}
$ret.= $char;
if(($char==',' || $char=='{' || $char=='[') && $outofquotes){
$ret.= $newline;
if($char=='{' || $char=='['){
$pos++;
}
for($j=0; $j<$pos; $j++){
$ret.= $indent;
}
}
$prevchar= $char;
}
return$ret;
}
/** 将数组元素进行urlencode
* @param String $val
*/
function jsonFormatProtect(&$val){
if($val!==true && $val!==false && $val!==null){
$val= urlencode($val);
}
}
?>