代码改变世界

json_encode 中文乱码

2012-11-11 19:51  brookin  阅读(649)  评论(0编辑  收藏  举报

问题:使用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"}}}

["中国人","日本人","美国人"]