php中json_encode处理

php 中函数很多,用起来都比较顺手。正是这样,久而久之,就会形成一种只看参数名称,不仔细阅读函数用法的坏习惯。比如,其中的 json_encode , 现在大多数网站是采用 UTF8 编码,这种情况下使用 json_encode 是没有任何问题的,但当网站编码是其他时,这就不好了,如下:

<?php

// 字符串
$str = '我是中国人';
$json_str = json_encode($str);
var_dump($json_str, json_decode($json_str));

// 对象
class stu {
	var $age = 10;
	var $name = '老外';
}
$s1 = new stu();
$json_s1 = json_encode($s1);
var_dump($json_s1, json_decode($json_s1));
?>
如果上面文件保存为 UTF8 编码时,结果完全正确,如果保存为其他编码时,结果不是你期望的。

其实这个情况,在手册中是有说明的,如下:
待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据(译注:指字符/字符串类型的数据)

那么,如果我们的编码不是 UTF8 时就完全不能使用这个功能吗?可以,需要稍加处理,如下:

define('DEFAULT_CHARSET', 'gbk');

function json_safe_encode($var)
{
    return json_encode(json_fix_cyr($var));
}

function json_fix_cyr($var)
{
    if (is_array($var)) {
        $new = array();
        foreach ($var as $k => $v) {
            $new[json_fix_cyr($k)] = json_fix_cyr($v);
        }
        $var = $new;
    } elseif (is_object($var)) {
        $vars = get_class_vars(get_class($var));
        foreach ($vars as $m => $v) {
            $var->$m = json_fix_cyr($v);
        }
    } elseif (is_string($var)) {
        $var = iconv(DEFAULT_CHARSET, 'utf-8', $var);
    }
    return $var;
} 
上面的例子是假设是 gbk 编码的情况,如果是其他编码情况,聪明的你一定知道该怎么搞了吧~~


11
Aug 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

添加新评论 »

   点击刷新验证码