极品分享

PHP中Json输出中文乱码的处理类![完美解决php中json乱码]

<?php
header("Content-type:text/html;charset=utf-8");
class Json{
   /**************************************************************
    *
    * 将数组转换为JSON字符串(兼容中文)
    * @param array $array 要转换的数组
    * @return string 转换得到的json字符串
    * @access public
    *
    *************************************************************/
    public static function arrayToJsonCN($array) {
      $php_version = explode('.', phpversion());
      //判断版本
      if(($php_version[0]>=5) && ($php_version[1]>=4)){
          return json_encode($array, JSON_UNESCAPED_UNICODE);
      }else{
          self::arrayRecursive($array, 'urlencode', true);
        $json = json_encode($array);
        return urldecode($json);
      }
    }
   /**************************************************************
    *
    * 使用特定function对数组中所有元素做处理
    * @param string &$array 要处理的字符串
    * @param string $function 要执行的函数
    * @return boolean $apply_to_keys_also 是否也应用到key上
    * @access public
    *
    *************************************************************/
    public static function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
    {
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
    die('possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
    if (is_array($value)) {
    self::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--;
    }
}
 
//调用:
$data=array(
  'id'=>1,
  'name'=>'苍井空',
  'class'=>'高一三班'
);
echo Json::arrayToJsonCN($data);
 
 
 
?>


以上是自己写的一个处理类,php5.4以上版本用php自带函数处理,5.4以下版本用urlencode、urldecode处理。

以下为网上找的材料:


在jquery的使用中,json的数据往往是从后台取出来,然而,由服务器端生成的json数据,在前端调用时有时会遇到一些问题,而出现乱码则属于较为常见的现象。本文将通过实例与大家分享一下php生成json数据为乱码的处理方法。php生成json数据的例子,非常多,这里不再介绍,本文要介绍的是对于php生成json数据为乱码的处理方法。php生成json数据为乱码的处理方法一先看看下面这段由php生成的json字符串:

{"total":239,"list":[{"code":"001","name":"\u4e2d\u56fd","addr":"Address 11","col4":"col4 data"},{"code":"002","name":"Name 2","addr":"Address 12","col4":"col4 data"}]}


"\u4e2d\u56fd"就是一段乱码,我们现在的目标是把这段乱码变成可读字符串。

通过测试,可以采用这样的方法解决问题:在php生成json的程序中,在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。

下面为两个处理函数,可以直接调用:

/************************************************************** 
 * 
 *  将数组转换为JSON字符串(兼容中文) 
 *  @param  array   $array      要转换的数组 
 *  @return string      转换得到的json字符串 
 *  @access public 
 * 
 *************************************************************/
function JSON($array) { 
    arrayRecursive($array, 'urlencode', true); 
    $json = json_encode($array); 
    return urldecode($json); 
} 
/************************************************************** 
 * 
 *  使用特定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 = 0; 
    if (++$recursive_counter > 1000) { 
        die('possible deep recursion attack'); 
    } 
    foreach ($array as $key => $value) { 
        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--; 
}                                                                                      
echo JSON($jarr);


通过这样处理后,"\u4e2d\u56fd"这段乱码就会变成了"中国"的可读字符了。

php实现的另外一种解决方法

该方法跟上面的方法类似,也是先urlencode (),再urldecode()来处理。

参考如下实例

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
//建立数据库连接
//$con = mysql_connect ( "localhost", "name", "yourpwd" );
if (! $con) {
    die ( 'Could not connect: ' . mysql_error () );
}
//选择查询的数据库
mysql_select_db ( "china_city", $con );
//设置字符集为UTF-8
mysql_query ( "set names utf8" );
$query = "select * from provincial";
//执行SQL语句
$result = mysql_query ( $query );
//循环 将查询的数据存入数组
while ( $row = mysql_fetch_assoc ( $result ) ) {
    $response [] = $row;
}
//使用Foreach遍历数组 同时使用urlencode处理 含有中文的字段
foreach ( $response as $key => $value ) {
    $newData[$key] = $value;
    $newData [$key] ['Provincial'] = urlencode ( $value ['Provincial'] );
}
echo urldecode ( json_encode ( $newData ) );
mysql_close ( $con );
?>


在客户端处理json乱码的方法

有人认为,json_encode()输出的是标准的json对象,那个不叫乱码。我觉得也有道理,处理这种编码应该可以在客户端实现,而不需要在服务器处理。

如下便是在客户端的处理方法。

如果是ajax,直接

echo json_encode($response); //这里输出的中文是乱码

在客户端,

$.post('url.php', {'data': 'mydata'}, function(data){
data = eval('(' + data +')');
alert(data[0].Provincial);
})


弹出的不会是乱码的。如果觉得eval函数不安全,可以使用$.getJSON( );,如果选择了jquery库的话。

还有,使用这种方法要注意的一点是,如果数据源还有特殊符号,比如",\\,客户端使用eval解析会出现问题。

相关意见

echo json_encode($var); 输出的是标准的json字符串,中文本来就是被转换过的,不是什么乱码。

如果项目编码不是utf8,直接使用json_encode转换出来的中文会变成NULL的,urlencode后就不存在这个问题了。

生成json字符串的时候只能使用utf-8。不过可以用下面这个函数先实现utf8数组转码然后在直接使用json_encode():

function output($arr = array()) {    return eval('return ' . iconv('GB2312', 'UTF-8', var_export($arr, true)) . ';');}


如果客户端是用js写,确实没什么必要在php服务器端处理字符串问题。但是我最近在用java的intent链接一个php的url返回数据,一直是转化后的编码,java客户端也没找到解决办法,这时在服务器端的处理方法就很管用。

2015-03-11 0 /
PHP学习
/
标签: 

评论回复

回到顶部