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

贊助商

分類目錄

贊助商

最新文章

搜索

php生成json數(shù)據(jù)為亂碼的幾種處理方法

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

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

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

php生成json數(shù)據(jù)為亂碼的處理方法一

先看看下面這段由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"就是一段亂碼,我們現(xiàn)在的目標(biāo)是把這段亂碼變成可讀字符串。

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

下面為兩個處理函數(shù),可以直接調(diào)用:

/**************************************************************
 *
 *  將數(shù)組轉(zhuǎn)換為JSON字符串(兼容中文)
 *  @param  array   $array      要轉(zhuǎn)換的數(shù)組
 *  @return string      轉(zhuǎn)換得到的json字符串
 *  @access public
 *
 *************************************************************/
function JSON($array) {
    arrayRecursive($array, 'urlencode', true);
    $json = json_encode($array);
    return urldecode($json);
}
/**************************************************************
 *
 *  使用特定function對數(shù)組中所有元素做處理
 *  @param  string  &$array     要處理的字符串
 *  @param  string  $function   要執(zhí)行的函數(shù)
 *  @return boolean $apply_to_keys_also     是否也應(yīng)用到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實(shí)現(xiàn)的另外一種解決方法

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

參考如下實(shí)例

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

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

有人認(rèn)為,json_encode()輸出的是標(biāo)準(zhǔn)的json對象,那個不叫亂碼。我覺得也有道理,處理這種編碼應(yīng)該可以在客戶端實(shí)現(xiàn),而不需要在服務(wù)器處理。

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

如果是ajax,直接

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

在客戶端,

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

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

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

相關(guān)意見

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

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

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

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

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

標(biāo)簽: json  
相關(guān)文章
    x
    • 站長推薦
    /* 左側(cè)顯示文章內(nèi)容目錄 */