技術頻道導航
HTML/CSS
.NET技術
IIS技術
PHP技術
Js/JQuery
Photoshop
Fireworks
服務器技術
操作系統(tǒng)
網站運營

贊助商

分類目錄

贊助商

最新文章

搜索

php生成json數據為亂碼的幾種處理方法

作者:admin    時間:2013-12-18 14:32:41    瀏覽:

在jquery的使用中,json的數據往往是從后臺取出來,然而,由服務器端生成的json數據,在前端調用時有時會遇到一些問題,而出現亂碼則屬于較為常見的現象。本文將通過實例與大家分享一下php生成json數據為亂碼的處理方法。

php生成json數據的例子,非常多,這里不再介紹,本文要介紹的是對于php生成json數據為亂碼的處理方法。

php生成json數據為亂碼的處理方法一

先看看下面這段由php生成的json字符串:

{"total":239,"list":[{"code":"001","name":"\u4e2d\u56fd","addr":"Address 11","col4":"col4 data"},{"code":"002","name":"Name 2","addr":"Address 12","col4":"col4 data"}]}

"\u4e2d\u56fd"就是一段亂碼,我們現在的目標是把這段亂碼變成可讀字符串。

通過測試,可以采用這樣的方法解決問題:在php生成json的程序中,在json_encode之前,把所有數組內所有內容都用urlencode()處理一下,然用json_encode()轉換成json字符串,最后再用urldecode()將編碼過的中文轉回來。

下面為兩個處理函數,可以直接調用:

/**************************************************************
 *
 *  將數組轉換為JSON字符串(兼容中文)
 *  @param  array   $array      要轉換的數組
 *  @return string      轉換得到的json字符串
 *  @access public
 *
 *************************************************************/
function JSON($array) {
    arrayRecursive($array, 'urlencode', true);
    $json = json_encode($array);
    return urldecode($json);
}
/**************************************************************
 *
 *  使用特定function對數組中所有元素做處理
 *  @param  string  &$array     要處理的字符串
 *  @param  string  $function   要執(zhí)行的函數
 *  @return boolean $apply_to_keys_also     是否也應用到key上
 *  @access public
 *
 *************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false){
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('possible deep recursion attack');
    }
    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]);
            }
        }
    }
    $recursive_counter--;
}                                                                                     
echo JSON($jarr);

通過這樣處理后,"\u4e2d\u56fd"這段亂碼就會變成了"中國"的可讀字符了。

php實現的另外一種解決方法

該方法跟上面的方法類似,也是先urlencode (),再urldecode()來處理。

參考如下實例

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
//建立數據庫連接
//$con = mysql_connect ( "localhost", "name", "yourpwd" );
if (! $con) {
    die ( 'Could not connect: ' . mysql_error () );
}
//選擇查詢的數據庫
mysql_select_db ( "china_city", $con );
//設置字符集為UTF-8
mysql_query ( "set names utf8" );
$query = "select * from provincial";
//執(zhí)行SQL語句
$result = mysql_query ( $query );
//循環(huán) 將查詢的數據存入數組
while ( $row = mysql_fetch_assoc ( $result ) ) {
    $response [] = $row;
}
//使用Foreach遍歷數組 同時使用urlencode處理 含有中文的字段
foreach ( $response as $key => $value ) {
    $newData[$key] = $value;
    $newData [$key] ['Provincial'] = urlencode ( $value ['Provincial'] );
}
echo urldecode ( json_encode ( $newData ) );
mysql_close ( $con );
?>

在客戶端處理json亂碼的方法

有人認為,json_encode()輸出的是標準的json對象,那個不叫亂碼。我覺得也有道理,處理這種編碼應該可以在客戶端實現,而不需要在服務器處理。

如下便是在客戶端的處理方法。

如果是ajax,直接

echo json_encode($response); //這里輸出的中文是亂碼

在客戶端,

$.post('url.php', {'data': 'mydata'}, function(data){
data = eval('(' + data +')');
alert(data[0].Provincial);
})

彈出的不會是亂碼的。如果覺得eval函數不安全,可以使用$.getJSON( );,如果選擇了jquery庫的話。

還有,使用這種方法要注意的一點是,如果數據源還有特殊符號,比如",\\,客戶端使用eval解析會出現問題。

相關意見

echo json_encode($var); 輸出的是標準的json字符串,中文本來就是被轉換過的,不是什么亂碼。

如果項目編碼不是utf8,直接使用json_encode轉換出來的中文會變成NULL的,urlencode后就不存在這個問題了。

生成json字符串的時候只能使用utf-8。不過可以用下面這個函數先實現utf8數組轉碼然后在直接使用json_encode():

function output($arr = array()) {    return eval('return ' . iconv('GB2312', 'UTF-8', var_export($arr, true)) . ';');}

如果客戶端是用js寫,確實沒什么必要在php服務器端處理字符串問題。但是我最近在用java的intent鏈接一個php的url返回數據,一直是轉化后的編碼,java客戶端也沒找到解決辦法,這時在服務器端的處理方法就很管用。

標簽: json  
相關文章
    x