PHPjson_encode()函数详解及中⽂乱码问题
在 php 中使⽤ json_encode() 内置函数(php > 5.2)可以使⽤得 php 中数据可以与其它语⾔很好的传递并且使⽤它。
这个函数的功能是将数值转换成json数据存储格式。
<?php
$arr = array
(
'Name'=>'希亚',
'Age'=>
);
$jsonencode = json_encode($arr);
echo $jsonencode;
>
程序运⾏结果如下:
{"Name":null,"Age":}
json_encode 函数中中⽂被编码成 null 了,Google 了⼀下,很简单,为了与前端紧密结合,Json 只⽀持 utf- 编码,我认为是前端的 Javascript 也是 utf- 的原因。
<?php
$array = array
(
'title'=>iconv('gb','utf-','这⾥是中⽂标题'),
'body'=>''
);
echo json_encode($array);
>
这个程序的运⾏结果为:
{"title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","body":""}
数组中所有中⽂在json_encode之后都不见了或者出现\u2353等。
解决⽅法是⽤urlencode()函数处理以下,在json_encode之前,把所有数组内所有内容都⽤urlencode()处理⼀下,然⽤
json_encode()转换成json字符串,最后再⽤urldecode()将编码过的中⽂转回来。
<?php
/**************************************************************
*
* 使⽤特定function对数组中所有元素做处理
* @param string &$array 要处理的字符串
* @param string $function 要执⾏的函数
* @return boolean $apply_to_keys_also 是否也应⽤到key上
* @access public
*
*************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
static $recursive_counter = ;
if (++$recursive_counter > ) {
die('possible deep recursion attack');
}
foreach ($array as $key => $value) {
phpjson格式化输出if (is_array($value)) {
arrayRecursive($array[$key], $function, $apply_to_keys_also);
} else {
$array[$key] = $function($value);
}
if ($apply_to_keys_also && is_string($key)) {
$new_key = $function($key);
if ($new_key != $key) {
$array[$new_key] = $array[$key];
unset($array[$key]);
}
}
}
$recursive_counter--;
}
/**************************************************************
*
* 将数组转换为JSON字符串(兼容中⽂)
* @param array $array 要转换的数组
* @return string 转换得到的json字符串
* @access public
*
*************************************************************/
function JSON($array) {
arrayRecursive($array, 'urlencode', true);
$json = json_encode($array);
return urldecode($json);
}
$array = array
(
'Name'=>'希亚',
'Age'=>
)
;
echo JSON($array);
>
这次成功了,运⾏结果如下:
{"Name":"希亚","Age":"20"}
下⾯给⼤家介绍PHP json_encode中⽂乱码解决⽅法
相信很多⼈在使⽤Ajax与后台php页⾯进⾏交互的时候都碰到过中⽂乱码的问题。JSON作为⼀种轻量级的数据交换格式,备受亲睐,但是⽤PHP作为后台交互,容易出现中⽂乱码的问题。JSON和js⼀样,对于客户端的字符都是以UTF8的形式进⾏处理的,也就是说,使⽤JSON作为提交和接收的数据格式时字符都采⽤UTF8编码处理,当我们的页⾯编码和数据库编码不是采⽤UTF8的时候,就极容易出现中⽂乱码的问题。解决办法⾃然是在⽤js或者PHP处理JSON数据的时候都采⽤UTF8的形式。
PHP5.2或以上的版本把json_encode作为内置函数来⽤,给⽹站制作者带来了很⼤的⽅便,但是我们必须注意到
json_encode只⽀持UTF8编码的字符,否则,中⽂乱码或者空值就出现了。
解决办法分为以下两个步骤。
Step1
保证在使⽤JSON处理的时候字符是以UTF8编码的。具体我们可以把数据库编码和页⾯编码都改为UTF8。当然喜欢⽤gbk编码的话,可以在进⾏JSON处理前,把字符转为UTF8形式。在PHP中有如下⽅法:
<?php
$data="JSON中⽂";
$newData=iconv("GB2312","UTF-8//IGNORE",$data);
echo $newData;
//ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后⾯的字符都不会被保存。
//或是("GB2312","UTF-8",$data);
>
Step2
后台PHP页⾯(页⾯编码为UTF-8或者已经把字符转为UTF-8)使⽤json_encode将PHP中的array数组转为JSON字符串。例如:
<?php
$testJSON=array('name'=>'中⽂字符串','value'=>'test');
echo json_encode($testJSON);
>
查看输出结果为:
{“name”:”\u4e2d\u6587\u5b57\u7b26\u4e32″,”value”:”test”}
可见即使⽤UTF8编码的字符,使⽤json_encode也出现了中⽂乱码。解决办法是在使⽤json_encode之前把字符⽤函数urlencode()处理⼀下,然后再json_encode,输出结果的时候在⽤函数urldecode()
转回来。具体如下:
<?php
$testJSON=array('name'=>'中⽂字符串','value'=>'test');
//echo json_encode($testJSON);
foreach ( $testJSON as $key => $value ) {
$testJSON[$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $testJSON ) );
>
查看输出结果为:
{“name”:”中⽂字符串”,”value”:”test”}
到此,成功地输出了中⽂字符。随意使⽤json_encode吧。这样⼦在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中⽂乱码,因为js在处理JSON格式数据是也是以UTF8的形式进⾏的,与PHP类似,故接收PHP页⾯的JSON字符串不会出现问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论