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 编码的情况,如果是其他编码情况,聪明的你一定知道该怎么搞了吧~~
