PHP默认的json_encode编码出来的是unicode编码的,也就是\u的编码,用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 相似”\u***”的格式。php
/默认为:{"test":"\u6211\u662f\u6d4b\u8bd5"}
虽然unicode编码能够在不一样的页面中编码不会出现乱码问题。可是一个汉字编码成unicode会变成\u+4个字符,增长了字符串的长度,还会在必定程度上增长传输的数据量.json
程序问题: 1.页面使用GBK编码格式,当字符串内有汉字是,echo 没数据输出 把汉字改为英文则有数据输出数组
{"ResponseCode":"01","ResponseInfo":"english","CardID":""}
json_encode出null的问题 若是文档编码或者字符串编码(例如UTF-8抓取了一个GBK页面)为非UTF-8,就会出现json_encode编码失败的问题,变现为输出汉字为null。函数
解决的方法就是在json_encode以前用iconv函数将汉字转为UTF-8。编码
2.页面使用UTF-8编码,有数据输出,可是出现乱码url
{"ResponseCode":"01","ResponseInfo":"\u53c2\u6570\u4e0d\u5b8c\u6574\uff0c\u4ea4\u6613\u5931\u8d25","CardID":""}
缘由: PHP5.2或以上的版本把json_encode做为内置函数来用,但只支持utf-8编码的字符,不然中文就会出现乱码或者空值code
解决办法以下: 保证在使用JSON处理的时候字符是以UTF8编码的,若是喜欢用gbk编码的话,能够在进行JSON处理前,把字符转为UTF8形式。 1.转换中文字符串格式utf-8
<?php $data="JSON中文"; $newData=iconv("GB2312","UTF-8//IGNORE",$data); echo $newData; ?>
//ignore的意思是忽略转换时的错误,若是没有ignore参数,全部该字符后面的字符都不会被保存。
2.页面编码为UTF-8或者已经把字符转为UTF-8,使用json_encode将PHP中的array数组转为JSON字符串unicode
<?php $testJSON=array('name'=>'中文字符串','value'=>'test'); echo json_encode($testJSON); ?>
查看输出结果为:
{“name”:”\u4e2d\u6587\u5b57\u7b26\u4e32″,”value”:”test”}
可见即便用UTF8编码的字符,使用json_encode也出现了中文乱码。文档
解决办法:
在使用json_encode以前把字符用函数urlencode()处理一下,而后再json_encode,输出结果的时候在用函数urldecode()转回来。具体以下:
<?php $testJSON=array('name'=>'中文字符串','value'=>'test'); foreach ( $testJSON as $key => $value ) { $testJSON[$key] = urlencode ( $value ); } echo urldecode ( json_encode ( $testJSON ) ); ?>
此时输出结果为: {“name”:”中文字符串”,”value”:”test”}
总结: 中文字符串必须为UTF-8编码,且须要进行urlencode() 编码和urldecode() 解码进行输出
方法二: PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE。加上这个选项后,就不会自动把中文编码了。 为json_encode()设置第二个参数 JSON_UNESCAPED_UNICODE
$url = '中国'; //echo json_encode($url); 乱码 echo json_encode($url,JSON_UNESCAPED_UNICODE ); //正常输出
JSON_UNESCAPED_UNICODE :以字面编码多字节 Unicode 字符(默认是编码成 \uXXXX)。** 自 PHP 5.4.0 起生效**
方法三
对unicode码再进行解码,解码函数以下:
<?php function decodeUnicode($str) { return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function( '$matches', 'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");' ), $str); } $arr = array('name1'=>"中文",'name2'=>'abc12'); echo decodeUnicode(json_encode($arr));