PHP JSON_json encode 编码使用后中文变成百分号乱码了

在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
\u738b 是Unicode编码,如果在js中可以直接显示不用转换,不过也可以json_encode($arr, JSON_UNESCAPED_UNICODE);//php5.4+
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
楼主可以先对中文进行 urlencode,最后再 urldecode 就可以了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
把要转成json的中文数组作为参数传递给jsonify函数
function jsonify($arr){
foreach($arr as $key=&$value){
$arr[$key]=url_encode($value);
function url_encode($str) {
if(is_array($str)) {
foreach($str as $key=&$value){
$str[urlencode($key)] = url_encode($value);
$str = urlencode($str);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我在utf-8编码下面从来就没出过问题。所以,如果你是gbk编码,试试这个:
$str = '中文';
$str = iconv("gbk", "utf-8", $str);
echo json_encode([$str]);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
//PHP版本5.4以上:
json_encode($data,JSON_UNESCAPED_UNICODE);
//PHP版本5.2以上才有json_encode/json_decode系列函数。
//PHP版本5.2-5.3,可以利用PHP的urlencode/urldecode的组合使用,可以达到类似的保留中文的效果。
//示例如下:代码里的MyJsonEncode和MyJsonDecode函数可以保留中文。
//数组转换保留为中文的JSON字符串
function MyJsonEncode($data){
return urldecode(json_encode(MyUrlEncode($data)));
//需要PHP版本5.4以上:
//return json_encode($data,JSON_UNESCAPED_UNICODE);
//保留中文的JSON字符串转换为数组
function MyJsonDecode($data){
$data = urlencode($data);
$data = str_replace("%7B",'{',$data);
$data = str_replace("%7D",'}',$data);
$data = str_replace("%5B",'[',$data);
$data = str_replace("%5D",']',$data);
$data = str_replace("%3A",':',$data);
$data = str_replace("%2C",',',$data);
$data = str_replace("%22",'"',$data);
return MyUrlDecode(json_decode($data,true));
//自定义的URL编码
function MyUrlEncode($data) {
//可对关联数组进行URL编码,并处理换行符
//内部递归调用
//用于MyJsonEncode函数调用
if(!is_array($data)){
$data = str_replace("\r",'\r',$data);
$data = str_replace("\n",'\n',$data);
$data = urlencode($data);
foreach($data as $key=&$value) {
$data[MyUrlEncode($key)] = MyUrlEncode($value);
if((string)MyUrlEncode($key)!==(string)$key){
unset($data[$key]);
//自定义的URL解码
function MyUrlDecode($data) {
//可对关联数组进行URL解码,并处理换行符
//内部递归调用
//用于MyJsonDecode函数调用
if(!is_array($data)){
$data = urldecode($data);
$data = str_replace('\r',"\r",$data);
$data = str_replace('\n',"\n",$data);
foreach($data as $key=&$value) {
$data[MyUrlDecode($key)] = MyUrlDecode($value);
if((string)MyUrlDecode($key)!==(string)$key){
unset($data[$key]);
//以上代码来自。
//GitHub开源地址:
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。PHP5.4中json_encode中文转码的变化[让json更懂中文]
在php5.4以前做json_encode的时候中文会被unicode编码,中文都会被编码, 变成不可读的, 类似&\u***&的格式, 还会在一定程度上增加传输的数据量。
$str = '中文';
echo json_encode($str);
//&\u4e2d\u6587&
php5.4开始
echo json_encode($str, JSON_UNESCAPED_UNICODE); &
php5.4让json更懂中文!
5.4之前不进行unicode转码,有3种方法处理:
5.4中json_encode中文转码的变化让json更懂中文
但其实前两种方式是会导致问题,在一些特殊的情况下。如下例:
function myjson($code) {
& & $code = json_encode(urlencodeAry($code));
& & return urldecode($code);
function urlencodeAry($data) {
& & if(is_array($data)) {
& & & & foreach($data as $key=&$val) {
& & & & & & $data[$key] = urlencodeAry($val);
& & & & return $
& & } else {
& & & & return urlencode($data);
$test = array (
& & 0 =& '&大连周水子机场&&人民路',
& & 1 =& '运营时间:5:10~21:00 票价:16元 发车间隔20分钟一班,客满随时发车',
通过常规则的json_encode|json_decode来编解码
[&\&\u5927\u8fde\u\u5b50\u673a\u573a\&\u2192\u4eba\u6c11\u8def&,&\u8fd0\u
\u95f4\uff1a5\uff1a10\uff5e21\uff1a00 \u\uff1a16\u5143 \u53d1\u8f66\u95f4\u969420
\uf\u4e00\u73ed\uff0c\u5ba2\u6ee1\u968f\u65f6\u53d1\u8f66&]
& 0 =& '&大连周水子机场&&人民路',
& 1 =& '运营时间:5:10~21:00 票价:16元 发车间隔20分钟一班,客满随时发车',
$test1 = json_encode($test);
$test2 = json_decode($test1, TRUE);
echo $test1;
echo PHP_EOL;
var_export($test2);
echo PHP_EOL;
通过myjson|json_decode来编解码,但是会出报错json_last_error返回(JSON_ERROR_SYNTAX === 4),
因为&&大连周水子机场&&人民路&
[&&大连周水子机场&&人民路&,&运营时间:5:10~21:00 票价:16元 发车间隔20分钟一班,客满随时发车&]
$test1_1 = myjson($test);
$test2_1 = json_decode($test1_1, TRUE);
echo $test1_1;
echo PHP_EOL;
var_export($test2_1);
echo PHP_EOL;
通过json_enco+pack|json_decode来编解码,保证不会对中文编码,但是会缺少运营时间数据和票价
[&\&大连周水子机场\&&人民路&,&运营时间::~: 票价:元 发车间隔分钟一班,客满随时发车&]
array ( www.2cto.com
& 0 =& '&大连周水子机场&&人民路',
& 1 =& '运营时间::~: 票价:元 发车间隔分钟一班,客满随时发车',
function replaceUni($str) {
& & return preg_replace(&#\\\u([0-9a-f]+)#ie&, &iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))&, $str);
$test1_2 = replaceUni(json_encode($test));
$test2_2 = json_decode($test1_2, TRUE);
echo $test1_2;
echo PHP_EOL;
var_export($test2_2);
echo PHP_EOL;当使用php自带的json_encode对数据进行编码时,中文都会变成unicode,导致不可读。如:对字符串&厦门&进行json_encode后,输出的是"\u53a6\u95e8"。
u5fae\u535a\u\u66f4\u65b0为unicode 编码大多数在 js 或者
json 里面常见~
查询了一下,有两种方法:
1.将"\u53a6\u95e8"还原成&厦门&,使用如下的代码:
$str= preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $str);
2.先将中文字段urlencode,json_encode后,再用urldecode,也可以显示中文。
$code = urldecode(json_encode(urlencode("厦门")));
PHP5.4版本,已经给Json新增了一个选项: JSON_UNESCAPED_UNICODE。加上这个选项后,就不会自动把中文编码了。
echo json_encode("厦门", JSON_UNESCAPED_UNICODE);
另,由于 json_encode 和 json_decode只支持utf-8编码的字符,GBK的字符要用json就得转换一下,附自己写的GBK转UTF-8的代码:
字符串GBK转码为UTF-8,数字转换为数字。
function ct2($s){
if(is_numeric($s)) {
return intval($s);
return iconv("GBK","UTF-8",$s);
批量处理gbk-&utf-8
function icon_to_utf8($s) {
if(is_array($s)) {
foreach($s as $key =& $val) {
$s[$key] = icon_to_utf8($val);
$s = ct2($s);
return $s;
echo json_encode(icon_to_utf8("厦门"))
阅读(...) 评论()
Where is the starting point, we don't have a choice, but the destination where we can pursue!在编码过程中、经常会用到json_encode来处理中文、但是、出现一个问题、中文都会被转码、变为” \u**** ”的格式、如何避免被转码、1:PHP的版本为5.4以上;echo json_encode( '中文' );
// "\u4e2d\u6587"echo json_encode( '中文', JSON_UNESCAPED_UNICODE );
// "中文"2:先把汉字urlencode转码、在json_ 然后urldecode解码;echo $con = '中文';
// 中文echo $con = urlencode( $con );
// %E4%B8%AD%E6%96%87"echo $con = json_encode( $con );
// %E4%B8%AD%E6%96%87"echo $con = urldecode( $con );
阅读(...) 评论()php中json_encode处理gbk与gb2312中文乱码问题的解决方法
转载 & & 投稿:shichen2014
这篇文章主要介绍了php中json_encode处理gbk与gb2312中文乱码问题的解决方法,需要的朋友可以参考下
本文讲述了php中json_encode处理gbk与gb2312中文乱码问题的解决方法,具体方法如下:
1.json_encode()中文在gbk/gb2312中对中文返回为null
$arr = array (
'catid' =& '4',
'catname' =& 'www.jb51.net',
'meta_title' =& '脚本之家'
echo json_encode($arr);
运行结果:
[{"catid":"4","catname":"www.jb51.net","meta_title":null}]
  看一了吗"meta_title":null 他本来是有一个值的为"脚本之家"了,这个我们查了一下原理是json_encode只支持uft-8编码,我们转换一下
$data="JSON中文";
$newData=iconv("GB2312″,"UTF-8//IGNORE",$data);
echo $newD
//ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符都不会被保存。
//或是("GB2312″,"UTF-8″,$data);
2.后台PHP页面(页面编码为UTF-8或者已经把字符转为UTF-8)使用json_encode将PHP中的array数组转为JSON字符串。例如:
$testJSON=array('name'=&'中文字符串','value'=&'test');
echo json_encode($testJSON);
查看输出结果为:
{"name":"u4e2duu7b26u4e32″,"value":"test"}
  可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候再用函数urldecode()转回来。具体如下:
$testJSON=array('name'=&'中文字符串','value'=&'test');
//echo json_encode($testJSON);
foreach ( $testJSON as $key =& $value ) {
$testJSON[$key] = urlencode ( $value );
echo urldecode ( json_encode ( $testJSON ) );
查看输出结果为:
{"name":"中文字符串","value":"test"}
  总结:json_encode函数只能处理uft8字符串,如果是中文估计是对字节处理不好,因为中文gbk与uft长度是不一样的,这个也不做深入介绍了。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 json encode 编码 的文章

 

随机推荐