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"}
  • 相关阅读:
    剑指 Offer 41. 数据流中的中位数
    剑指 Offer 19. 正则表达式匹配
    leetcode 75 颜色分类
    Deepin 添加 open as root
    window 下 无损进行其他文件系统(ext4) 到 ntfs 文件系统的转化
    Windows Teminal Preview Settings
    CentOS 7 容器内替换 apt-get 源为阿里源
    Ubuntu 20.04 安装 Consul
    elementary os 15 添加Open folder as root
    elementary os 15 gitbook install
  • 原文地址:https://www.cnblogs.com/intervention/p/4031827.html
Copyright © 2011-2022 走看看