將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; } } }