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"}