可能用很多朋友使用json數據時利用php自帶的函數JSON_DECODE/JSON_ENCODE處理中文內容時會碰到出現NULL或亂碼問題,下面我來給大家介紹為什么會出現這樣的問題,例:
- <?php
- $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
- var_dump(json_decode($json));
- var_dump(json_decode($json, true));
- ?>
輸出結果
完全正確沒有任何問題,那么我們測試中文,代碼如下:
- <?php
- $json = '{"a":"中國人人"}';
- var_dump(json_decode($json));
- ?>
結果:{"text":null,"status":1},后來從php手冊中得出,json_encode 和 json_decode只支持utf-8編碼的字符,GBK的字符要用json就得轉換一下,這樣我們就好辦了
轉換一個編碼,代碼如下:
- /*
- 字符串GBK轉碼為UTF-8,數字轉換為數字。
- */
- function ct2($s){
- if(is_numeric($s)) {
- return intval($s);
- } else {
- return iconv("GBK","UTF-8",$s);
- }
- }
- /*
- 批量處理gbk->utf-8
- */
- function icon_to_utf8($s) {
- if(is_array($s)) {
- foreach($s as $key => $val) {
- $s[$key] = icon_to_utf8($val);
- }
- } else {
- $s = ct2($s);
- }
- return $s;
- }
- echo json_encode(icon_to_utf8("廈門"));
這樣還是有時會有問題,后來找了一種在json_encode之前,把所有數組內所有內容都用urlencode()處理一下,然用json_encode()轉換成json字符串,最后再用urldecode()將編碼過的中文轉回來,寫了個函數:
- /**************************************************************
- *
- * 使用特定function對數組中所有元素做處理
- * @param string &$array 要處理的字符串
- * @param string $function 要執行的函數
- * @return boolean $apply_to_keys_also 是否也應用到key上
- * @access public
- *
- *************************************************************/
- function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
- {
- foreach ($array as $key => $value) {
- if (is_array($value)) {
- arrayRecursive($array[$key], $function, $apply_to_keys_also);
- } else {
- $array[$key] = $function($value);
- }
- if ($apply_to_keys_also && is_string($key)) {
- $new_key = $function($key);
- if ($new_key != $key) {
- $array[$new_key] = $array[$key];
- unset($array[$key]);
- }
- }
- }
- }
- /**************************************************************
- *
- * 將數組轉換為JSON字符串(兼容中文)
- * @param array $array 要轉換的數組
- * @return string 轉換得到的json字符串
- * @access public
- *
- *************************************************************/
- function JSON($array) {
- arrayRecursive($array, 'urlencode', true);
- $json = json_encode($array);
- return urldecode($json);
- }
新聞熱點
疑難解答