PHP将数组转为json出现的中文乱码的问题

 

  1. 将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转码

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

  条件: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;
    }
  }
}

 

 

 

转载于:https://my.oschina.net/corwien/blog/609294

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值