无量小猪

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它

 

<?php
$data = array
       (
          'id'=>1, 
          'username'=>'哈哈',
          'title'=>'标题'
       );

$jsonencode = json_encode($data);
echo $jsonencode;
?>

输出的结果

{"id"1,"username":null,"title":null}

这是因为JSON只支持UTF8格式的编码,吧默认的中文编码给干掉了,所有要对输出的字符串进行转义

    if (CHARSET == 'gbk') {
    $data = array_iconv($data, 'gbk', 'utf-8');
    }
  $jsonencode = json_encode($data);
  echo $jsonencode;

 这样输出的结果为

{"id":1,"username":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898"}

 

数组中所有中文在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 = 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--;
}
 
/**************************************************************
 *
 *    将数组转换为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
       (
          'title'=>'标题',
          'content'=>'内容'
       );


echo JSON($array);
?>

这次成功了,运行结果如下:

 

{"title":"标题","content":"内容"}

 

 

 

posted on 2013-04-11 16:31  无量小猪  阅读(1767)  评论(0编辑  收藏  举报