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"}
  • 相关阅读:
    循环
    list和tuple
    Python字符串和编码注意点
    【转载】国内安卓推送的希望
    【转载】Android属性动画和视图动画的区别
    【转载】Android 属性动画详解
    【转载】 android 属性动画详解
    java8 新特性学习详细篇2
    java8 新特性详细篇
    JAVA8十大新特性
  • 原文地址:https://www.cnblogs.com/intervention/p/4031827.html
Copyright © 2011-2022 走看看