您好,欢迎访问一九零五行业门户网

php中json_decode()和json_encode()用法与中文不显示解决办法_PHP教程

本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。
php中json_decode()和json_encode()
1.json_decode()
json_decode
(php 5 >= 5.2.0, pecl json >= 1.2.0)
json_decode — 对 json 格式的字符串进行编码
说明
mixed json_decode ( string $json [, bool $assoc ] )
接受一个 json 格式的字符串并且把它转换为 php 变量
参数
json
待解码的 json string 格式的字符串。
assoc
当该参数为 true 时,将返回 array 而非 object 。
返回值
returns an object or if the optional assoc parameter is true, an associative array is instead returned.
范例
example #1 json_decode() 的例子
 代码如下 复制代码
上例将输出:
object(stdclass)#1 (5) {
[a] => int(1)
[b] => int(2)
[c] => int(3)
[d] => int(4)
[e] => int(5)
}
array(5) {
[a] => int(1)
[b] => int(2)
[c] => int(3)
[d] => int(4)
[e] => int(5)
}
$data='[{name:a1,number:123,contno:000,qqno:},{name:a1,number:123,contno:000,qqno:},{name:a1,number:123,contno:000,qqno:}]';
echo json_decode($data);
结果为:
array ( [0] => stdclass object ( [name] => a1 [number] => 123 [contno] => 000 [qqno] => ) [1] => stdclass object ( [name] => a1 [number] => 123 [contno] => 000 [qqno] => ) [2] => stdclass object ( [name] => a1 [number] => 123 [contno] => 000 [qqno] => ) )
可以看出经过json_decode()编译出来的是对象,现在输出json_decode($data,true)试下
 代码如下 复制代码
echo json_decode($data,true);
结果:
array ( [0] => array ( [name] => a1 [number] => 123 [contno] => 000 [qqno] => ) [1] => array ( [name] => a1 [number] => 123 [contno] => 000 [qqno] => ) [2] => array ( [name] => a1 [number] => 123 [contno] => 000 [qqno] => ) )
可以看出 json_decode($data,true)输出的一个关联数组,由此可知json_decode($data)输出的是对象,而json_decode($arr,true)是把它强制生成php关联数组.
2.json_encode()
json_encode
(php 5 >= 5.2.0, pecl json >= 1.2.0)
json_encode — 对变量进行 json 编码
report a bug 说明
string json_encode ( mixed $value [, int $options = 0 ] )
返回 value 值的 json 形式
report a bug 参数
value
待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 utf-8 编码的数据
options
由以下常量组成的二进制掩码: json_hex_quot, json_hex_tag, json_hex_amp, json_hex_apos, json_numeric_check, json_pretty_print, json_unescaped_slashes, json_force_object, json_unescaped_unicode.
report a bug 返回值
编码成功则返回一个以 json 形式表示的 string 或者在失败时返回 false 。
report a bug 更新日志
版本 说明
5.4.0 options 参数增加常量: json_pretty_print, json_unescaped_slashes, 和 json_unescaped_unicode。
5.3.3 options 参数增加常量:json_numeric_check。
5.3.0 增加 options 参数.
report a bug 范例
example #1 a json_encode() 的例子
 代码如下 复制代码
1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo json_encode($arr);
?>
以上例程会输出:
{a:1,b:2,c:3,d:4,e:5}
example #2 json_encode() 函数中 options 参数的用法
'bar', 'baz' => 'long');
echo associative array always output as object: , json_encode($d), n;
echo associative array always output as object: , json_encode($d, json_force_object), nn;
?>
以上例程会输出:
normal: [,'bar',baz,&blong&,u00e9]
tags: [u003cfoou003e,'bar',baz,&blong&,u00e9]
apos: [,u0027baru0027,baz,&blong&,u00e9]
quot: [,'bar',u0022bazu0022,&blong&,u00e9]
amp: [,'bar',baz,u0026blongu0026,u00e9]
unicode: [,'bar',baz,&blong&,é]
all: [u003cfoou003e,u0027baru0027,u0022bazu0022,u0026blongu0026,é]
empty array output as array: []
empty array output as object: {}
non-associative array output as array: [[1,2,3]]
non-associative array output as object: {0:{0:1,1:2,2:3}}
associative array always output as object: {foo:bar,baz:long}
associative array always output as object: {foo:bar,baz:long}
example #3 连续与非连续数组示例
 代码如下 复制代码
foo, 2=>bar, 3=>baz, 4=>blong);
var_dump(
$nonsequential,
json_encode($nonsequential)
);
echo php_eol.删除一个连续数组值的方式产生的非连续数组.php_eol;
unset($sequential[1]);
var_dump(
$sequential,
json_encode($sequential)
);
?>
以上例程会输出:
 代码如下 复制代码
连续数组
array(4) {
[0]=>
string(3) foo
[1]=>
string(3) bar
[2]=>
string(3) baz
[3]=>
string(5) blong
}
string(27) [foo,bar,baz,blong]
非连续数组
array(4) {
[1]=>
string(3) foo
[2]=>
string(3) bar
[3]=>
string(3) baz
[4]=>
string(5) blong
}
string(43) {1:foo,2:bar,3:baz,4:blong}
删除一个连续数组值的方式产生的非连续数组
array(3) {
[0]=>
string(3) foo
[2]=>
string(3) baz
[3]=>
string(5) blong
}
string(33) {0:foo,2:baz,3:blong}
$obj->name= 'a1';$obj->number ='123';
$obj->contno= '000';
echo json_encode($obj);
结果为:
{name:a1,
number:123,
contno:000
}
可以看出json_encode()和json_decode()是编译和反编译过程,注意json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null
如果是中文的话就要注意了
在网上找到一种解决方法:
 代码如下 复制代码
'冰火国度', 'name' => '刺之灵', 'country' => '冰霜国', 'level' => 45 );
echo json_encode ( $data );
echo
;
$newdata = array ();
foreach ( $data as $key => $value ) {
$newdata [$key] = urlencode ( $value );
}
echo urldecode ( json_encode ( $newdata ) );
?>
后来请教了别人,还可以用base64编码,不过base64编码不可以放在url中,百度是这样解释的:
标准的base64并不适合直接放在url里传输,因为url编码器会把标准base64中的“/”和“+”字符变为形如“%xx”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ansi sql中已将“%”号用作通配符。
不过我的数据是要通过post发送的,并不在http 的head中,而在message-body里,所以不受影响。
json_encode 只能接受utf-8格式的数据
例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。
我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!
测试代码如下:
 代码如下 复制代码
item2 = urlencode($this->item2);
$str_json = json_encode($this);
//url解码,转完json后将各属性返回,确保对象属性不变
$this->item2 = urldecode($this->item2);
return urldecode($str_json);
}
}
$c = new myclass();
echo json_encode($c);
echo '
';
echo $c->to_json();
echo '
';
echo json_encode($c);
echo '
';
echo json_encode('胥');
?>
程序输出结果:
{item1:1,item2:u4e2du6587}
{item1:1,item2:中文}
{item1:1,item2:u4e2du6587}
u80e5
http://www.bkjia.com/phpjc/632210.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/632210.htmltecharticle本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.js...
其它类似信息

推荐信息