黑帽联盟

 找回密码
 会员注册
查看: 1335|回复: 0
打印 上一主题 下一主题

[php] PHP json_encode() 函数介绍

[复制链接]
yun 黑帽联盟官方人员 

920

主题

37

听众

1364

积分

超级版主

Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2019-10-18 11:20
  • 签到天数: 678 天

    [LV.9]以坛为家II

    在 php 中使用 json_encode() 内置函数(php > 5.2)可以使用得 php 中数据可以与其它语言很好的传递并且使用它。
    这个函数的功能是将数值转换成json数据存储格式。
    1. <?php
    2. $arr = array
    3.        (
    4.           'Name'=>'希亚',
    5.           'Age'=>20
    6.        );

    7. $jsonencode = json_encode($arr);
    8. echo $jsonencode;
    9. ?>
    复制代码
    程序运行结果如下:
    1. {"Name":null,"Age":20}
    复制代码
    json_encode 函数中中文被编码成 null 了,Google 了一下,很简单,为了与前端紧密结合,Json 只支持 utf-8 编码,我认为是前端的 Javascript 也是 utf-8 的原因。
    1. <?php
    2. $array = array
    3.         (
    4.                  'title'=>iconv('gb2312','utf-8','这里是中文标题'),
    5.                 'body'=>'abcd...'
    6.         );

    7. echo json_encode($array);
    8. ?>
    复制代码
    这个程序的运行结果为:
    1. {"title":"\u8fd9\u91cc\u662f\u4e2d\u6587\u6807\u9898","body":"abcd..."}
    复制代码
    数组中所有中文在json_encode之后都不见了或者出现\u2353等。
    解决方法是用urlencode()函数处理以下,在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。
    1. <?php
    2. /**************************************************************
    3. *
    4. *        使用特定function对数组中所有元素做处理
    5. *        @param        string        &$array                要处理的字符串
    6. *        @param        string        $function        要执行的函数
    7. *        @return boolean        $apply_to_keys_also                是否也应用到key上
    8. *        @access public
    9. *
    10. *************************************************************/
    11. function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
    12. {
    13.     static $recursive_counter = 0;
    14.     if (++$recursive_counter > 1000) {
    15.         die('possible deep recursion attack');
    16.     }
    17.     foreach ($array as $key => $value) {
    18.         if (is_array($value)) {
    19.             arrayRecursive($array[$key], $function, $apply_to_keys_also);
    20.         } else {
    21.             $array[$key] = $function($value);
    22.         }

    23.         if ($apply_to_keys_also && is_string($key)) {
    24.             $new_key = $function($key);
    25.             if ($new_key != $key) {
    26.                 $array[$new_key] = $array[$key];
    27.                 unset($array[$key]);
    28.             }
    29.         }
    30.     }
    31.     $recursive_counter--;
    32. }

    33. /**************************************************************
    34. *
    35. *        将数组转换为JSON字符串(兼容中文)
    36. *        @param        array        $array                要转换的数组
    37. *        @return string                转换得到的json字符串
    38. *        @access public
    39. *
    40. *************************************************************/
    41. function JSON($array) {
    42.         arrayRecursive($array, 'urlencode', true);
    43.         $json = json_encode($array);
    44.         return urldecode($json);
    45. }

    46. $array = array
    47.        (
    48.           'Name'=>'希亚',
    49.           'Age'=>20
    50.        );


    51. echo JSON($array);
    52. ?>
    复制代码
    这次成功了,运行结果如下:
    1. {"Name":"希亚","Age":"20"}
    复制代码
    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部