json_decode mysql 乱码_PHP将数组转为json出现的中文乱码的问题

将GBK编码的含有中文数组转为json格式,先将每个值进行urlencode,然后json_encode,最后urldecode即可。

// 示例代码

$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转为数组

// 将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转码

$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() 函数小结:

条件:eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。

如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

$a ="hello";

$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;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值