将GBK编码的含有中文数组转为json格式,先将每一个值进行urlencode,而后json_encode,最后urldecode便可。php
// 示例代码 $testJSON=array('title' => '标题', 'url' => 'meitu.jpg'); foreach ( $testJSON as $key => $value ) { $testJSON[$key] = urlencode ( $value ); } $ret = urldecode ( json_encode ( $testJSON ) ); print_r($ret );
2.将json转为数组json
// 将GBK转为UTF-8后,再json_decode为数组json_decode($new_url, true),后边带true参数表示转为数组,不然默认为对象形式的 $new_url = iconv("GBK","UTF-8//IGNORE", $ret ); print_r(json_decode($new_url, true));
3.终极处理方法,对数组进行编码转换数组
用途:中文处理,在返回json时对原来的gbk编码进行utf-8转码函数
<?php $arr = array( array( 'name' => "周星驰", 'age' => "23", 'info' => array( 'address' => '旺角', ), ), array( 'name' => "发哥", "age" => 25 ), ); $in_charset = "gbk"; $out_charset = "utf-8"; function array_iconv($in_charset,$out_charset,$arr){ return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';')); } $res = array_iconv($in_charset, $out_charset, $arr); $res = json_encode($res); print_r($res);
原理很简单 var_export设置第二个参数为true,返回数组原型字符串,将字符串转换为utf-8编码,以后再用eval来执行返回(相似匿名函数?),至此完美解决问题。编码
eval() 函数小结:url
条件:eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。code
若是没有在代码字符串中调用 return 语句,则返回 NULL。若是代码中存在解析错误,则 eval() 函数返回 false。对象
$a ="hello";utf-8
$res = eval("return $a;");字符串
dump($res);
// 在赋值时必须用反斜杠对$标示符进行转义
eval("\$str = \"$str\";");
echo $str;
将上边的方法封装为一个函数,方便之后直接调用array_iconv_to_json($arr)便可:
/** * 将含有GBK的中文数组转为json * * @param array $arr 数组 * @param string $in_charset 原字符串编码 * @param string $out_charset 输出的字符串编码 * @return array */ function array_iconv_to_json($arr, $in_charset="gbk", $out_charset="utf-8") { $ret = eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';')); return json_encode($ret); }
``` // UTF-8编码转换为GBK编码(支持数组) function utf8_to_gbk($str) { if(is_array($str)) { foreach($str as $k => $v) { $str[$k] = utf8_to_gbk($v); } return $str; } else { if(is_string($str)) { return iconv('UTF-8', 'GBK//IGNORE', $str); } else { return $str; } } }