PHP將數組轉爲json出現的中文亂碼的問題

 

  1. 將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;
    }
  }
}
相關文章
相關標籤/搜索