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"}
原文地址:https://www.cnblogs.com/intervention/p/4031827.html