wkf928592 2012-07-19 09:19:01 3918次浏览 0条回复 0 0 0

【注】原文出处:http://www.wukunfan.com/index.php/json-encode.html json_encode无法编码GBK格式中文的解决方法 | 饭饭博客 这个问题也是在最近做数据迁移时遇到的,当页面设置为GBK格式时,用json_encode()得到的是NULL值。在网上搜了一下,一致认为的解决方法是先将要编码的中文用urlencode编码,然后再json_encode,然后使用时再用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)
{
    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--;
}

/**************************************************************
 *
 *    将数组转换为JSON字符串(兼容中文)
 *    @param    array    $array        要转换的数组
 *    @return string        转换得到的json字符串
 *    @access public
 *
 *************************************************************/
function JSON($array) {
    arrayRecursive($array, 'urlencode', true);
    $json = json_encode($array);
    return urldecode($json);
}[/code]但发现在数据迁移时有时陷入死循环,具体原因是使用了引用传值。我只所以选择使用这段代码是因为它给数组的键名也进行了编码,因为数据中键名也是中文。下面这段代码是我自己改过并亲测可用的,主要修改了将键名也进行json编码,下面见代码:[code]/**
* 对变量或者数据进行urlencode编码,使得在进行json_encode的时候进行编码的不是中文,防止json_encode失败
* @access private
* @param $var
* @return array
*/
function var_urlencode($var) {

    if (empty ( $var )) {
        return false;
    }
    if (is_array ( $var )) {
        foreach ( $var as $k => $v ) {
            if (is_scalar ( $v )) {
                $var [$k] = urlencode ( $v );
             }else {
                $var [$k] = var_urlencode ( $v );
             }
            //处理key
            $new_key = urlencode($k);
            if ($new_key != $k) {
                $var[$new_key] = $var[$k];
                unset($var[$k]);
            }

        }
    }else {
        $var = urlencode ( $var );
    }
    return $var;
}
/**
* 对编码后的变量进行json_encode,json_encode不支持中文的问题
* @access public
* @param $var
* @return string
*/
function var_json_encode($var) {
    $_var = var_urlencode($var);
    $_str = json_encode($_var);
    return urldecode($_str);
}
    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册