zoukankan      html  css  js  c++  java
  • php5.2的json_encode对中文字符的处理

    json已经被广泛用于结构数据序列化并保存/传输的过程,php也提供了对json的很方便的原生支持,但是在php 5.2中,json_encode函数会将中文进行Unicode转义编码,比如以下程序:

    <?php
    /*php version 5.2*/
    header("Content-type:text/html;charset=utf-8");
    $arr = array(
                    "name" => "蛙蛙",
                    "age" => "10"
                );
    $str = json_encode($arr);
    echo($str);

    会输出:

    {"name":"u86d9u86d9","age":"10"}

    最新的php 5.4中的json_encode已经增加了options参数,使用JSON_UNESCAPED_SLASHES即可不编码中文

    string json_encode ( mixed $value [, int $options = 0 ] )

    可是对于工程中已经使用着5.2版本的环境就无能为力

    网上的方法多多少少都有问题,比如urlencode法不能保留多个空格,而且在编码复杂的树形结构时要手动进行递归遍历,读取程序也必须能支持urldecode才方便使用,而从网上搜到的正则替换法(#\u([0-9a-f]{+})#ie)对诸如"蛙1234"这样的字符串编码会出错(其实就是没有限制长度),下面是一种改进的做法,在生产环境中测试没有出现问题:

    <?php
    /*php version = 5.2*/
    header("Content-type:text/html;charset=utf-8");
    function wz_output($arr)
    {
        $str = json_encode($arr);
        $search = "#\u([0-9a-f]{4})#ie";
        $replace = "iconv('UCS-2', 'UTF-8', pack('H4', '\1'))";
        echo preg_replace($search, $replace, $str);
    }
    $arr = array(
                    "name" => "蛙蛙",
                    "age" => "10"
                );
    wz_output($arr);

    输出:

    {"name":"蛙蛙","age":"10"}
  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/intervention/p/4031827.html
Copyright © 2011-2022 走看看