问题:使用json_encode可以方便地将对象进行json编码,但是如果对象或数组中存在中文,中文将会被转成null,json_encode会将中文转换为unicode编码
例如:'嘎'经过json_encode处理后变为'null',最终json中文部分被替换null。如何将对象转换为json并保证对象内部的中文在json中仍然是正常的中文出现,使用json_encode是不能达到目的的。
解决方法:
先将中文字段进行url编码(urlencode),然后对对象进行json_encode编码(json_encode),最后对json字符串url解码(urldecode),即最终的json里面的中文正常展示。
<?php
/**
* 解决json_encode不支持中文问题
*
* @Package
* @Copyright (c) 1998-2012 All Rights Reserved
* @Author
* @Version $Id$
*/
/**
* 对变量或者数据进行urlencode编码,使得在进行json_encode的时候进行编码的不是中文,防止json_encode失败
* @access private
* @param $var
* @return array
*/
function var_urlencode($var) {
if (empty ( $var )) {
return false;
}
if (is_array ( $var )) {
foreach ( $var as $k => $v ) {
if (is_scalar ( $v )) {
$var [$k] = urlencode ( $v );
} else {
$var [$k] = var_urlencode ( $v );
}
}
} else {
$var = urlencode ( $var );
}
return $var;
}
/**
* 对编码后的变量进行json_encode,json_encode不支持中文的问题
* @access public
* @param $var
* @return string
*/
function var_json_encode($var) {
$_var = var_urlencode($var);
$_str = json_encode($_var);
return urldecode($_str);
}
/*Test*/
$array = array (
'name' => '路人甲',
'age' => '13',
'profile' => array (
'uid' => 12,
'uname' => 'lili',
'school' => '中学',
'info' => array (
'hometown' => '亚洲',
'fond' => '苹果',
'tool' => 'bike',
),
),
);
$json_str = var_json_encode($array);
echo $json_str;
$var = array("中国人", "日本人", "美国人");
echo var_json_encode($var);
输出:
{"name":"路人甲","age":"13","profile":{"uid":"12","uname":"lili","school":"中学","info":{"hometown":"亚洲","fond":"苹果","tool":"bike"}}}
["中国人","日本人","美国人"]