转自:http://www.liaoxiaoqi.com/?p=451
注意,这里说的都是基于文本均为utf8格式的前提下,如果不是的话需要先进行转换。
在用PHP提供的json_encode进行转换时,如果遇到中文,就会被直接转换为utf8编码,形如“\u34ab\u9234\u43c1”,网上有人介绍的使用正则替换的方法来解决这个问题,如下:
1.
function
encode(
$code
)
2.
{
3.
$code
= json_encode(
$code
);
4.
return
preg_replace(
"#\\\u([0-9a-f]+)#ie"
,
"iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))"
,
$code
);
5.
}
function decode($code) {
return json_decode($code);
}
但是此方法在一些服务器环境,如Linux+Lighttpd等情况下,可能出现无法转换而导致乱码的情况。经过摸索,现提供比较具有通用性的做法是,先将要转换的数组或对象中的中文进行urlencode编码,在完成json转换后,再进行urldecode解码。具体如下:
01.
function
myjson(
$code
)
02.
{
03.
$code
= json_encode(urlencodeAry(
$code
));
04.
return
urldecode(
$code
);
05.
}
06.
07.
function
urlencodeAry(
$data
)
08.
{
09.
if
(
is_array
(
$data
))
10.
{
11.
foreach
(
$data
as
$key
=>
$val
)
12.
{
13.
$data
[
$key
] = urlencodeAry(
$val
);
14.
}
15.
return
$data
;
16.
}
17.
else
18.
{
19.
return
urlencode(
$data
);
20.
}
21.
}
补充:
PHP的strtolower()和strtoupper()函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,可使用类似的方法进行编解码。