JSON
是一种轻量级的数据交换格式,完全语言无关,但是采用了类似于C系列语言的约定,更详细的介绍可以参考: http://json.org
由于将数组/对象 序列化为JSON字符串的时候基本上只支持 UTF-8/ASCII, 而我们现在很多网站出于历史原因或者支持国产的原因,采用了GBK/GB2312编码,这个时候,直接使用json_encode/json_decode的时候就可能会出问题了。
我们从B/S两个方面谈这个问题。
首先从B(Browser)方面来讲,我们使用JSON作为和S(Server)数据交换的格式,无论如何,S返回的JSON字符串都已经是Unicode的了,由于JavaScript内部采用了Unicode 的编码,JavaScript会根据客户端的编码的不同而自动转化编码,JSON的解析也就不成问题了。比如: 返回的数据是
无论你的页面是GBK,还是UTF-8的,都将可以正确解析为
比较简单的方式是调用Javascript的eval函数:
try{ eval("var ret = " +"\"\u4e2d\u56fd\u4eba\";");} catch(e){}; alert(ret);
再来看看S(Server)端,json_encode/json_decode会假定给定的数据是UTF-8编码的,这儿就有几种思路了:
- 将数据转化为UTF-8编码的,然后再调用json_encode, 或者首先json_decode,然后再转化为GBK编码的。
- 将数据urlencode,这样所有的数据都是ASCII的了,调用json_encode就没有问题了,json_decode之后也需要 urldecode下。
- 自己编写函数将GBK编码直接转换为unicode代码。
其实第一种和第二种都是同样的思路,即将其编码转换为可encode的编码,下面看看上面提到的解决方案的具体代码:
encode之前转换为utf-8,decode之后转回gbk:
function tb_json_encode($value, $options = 0)
{
return json_encode(tb_json_convert_encoding($value, "GBK", "UTF-8"));
}
function tb_json_decode($str, $assoc = false, $depth = 512)
{
return tb_json_convert_encoding(json_decode($str, $assoc), "UTF-8", "GBK");
}
function tb_json_convert_encoding($m, $from, $to)
{
switch(gettype($m)) {
case 'integer':
case 'boolean':
case 'float':
case 'double':
case 'NULL':
return $m;
case 'string':
return mb_convert_encoding($m, $to, $from);
case 'object':
$vars = array_keys(get_object_vars($m));
foreach($vars as $key) {
$m->$key = tb_json_convert_encoding($m->$key, $from ,$to);
}
return $m;
case 'array':
foreach($m as $k => $v) {
$m[tb_json_convert_encoding($k, $from, $to)] = tb_json_convert_encoding($v, $from, $to);
}
return $m;
default:
}
return $m;
}
encode之前urlencode,decode之后urldecode:
function tb_json_encode(array $value, $options = 0) {
array_walk_recursive($value,'tb_json_encode');
return $value;
}
function tb_json_decode($value, $assoc = false, $depth = 512) {
array_walk_recursive($value,'tb_json_decode');
return $value;
}
function tb_urlencode(&$value, &$key) {
$key = urlencode($key);
$value = urlencode($value);
}
function tb_urldecode(&$value, &$key) {
$key = urldecode($key);
$value = urldecode($value);
}
第三种方式,在这儿就不详细介绍了。
参考:
-
http://gggeek.altervista.org/sw/article_20061113.html
-
http://json.org
经过测试发现PHP的递归实现是在是太慢了,于是尝试将地一种方案修改成了使用PHP内置的函数, 相比而言要好很多:
function tb_json_encode_ex($value, $options = 0)
{
array_walk_recursive($value, "tb_json_convert_encoding_g2u");
return json_encode($value);
}
function tb_json_decode_ex($value, $assoc = true, $depth = 512)
{
$value = json_decode($value);
array_walk_recursive($value, "tb_json_convert_encoding_u2g");
return $value;
}
function tb_json_convert_encoding_g2u(&$value, &$key)
{
$value = mb_convert_encoding($value, "UTF-8", "GBK");
}
function tb_json_convert_encoding_u2g(&$value, &$key)
{
$value = mb_convert_encoding($value, "GBK", "UTF-8");
}
事实上,第一种方式有一个优点是和基本的json_decode兼容,而第二种则不行。
第二种方式还可以有好多"变种",比如使用base64_encode/base64_decode 等等。
分享到:
相关推荐
### JSON中文乱码问题解析与解决方法 #### 一、问题背景 在处理JSON数据时,经常遇到中文字符出现乱码的问题。这主要是由于编码不一致导致的。本篇文章将详细探讨这一问题,并提供相应的解决方案。 #### 二、JSON...
JSON_UNESCAPED_UNICODE则允许保留Unicode字符,避免乱码问题。 ```php $options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE; $json = json_encode($data, $options); ``` 在处理错误时,json_last_error()...
在PHP与JSON数据交换过程中,常常会出现中文乱码的问题。这主要是因为JSON和JavaScript在客户端处理字符时默认采用UTF-8格式,而当数据库和PHP页面编码不一致时,中文字符在与JSON交互中就会出现乱码。为了解决这一...
然而,在使用PHP的json_encode函数进行数据编码时,常常会遇到中文乱码的问题,尤其是当涉及到中文字符编码为UTF-8时。本篇知识分享将详细解释在PHP中遇到json_encode中文乱码问题时的解决办法。 ### 1. JSON编码...
然而,当我们处理包含中文汉字的数据时,`json_encode`默认会转义这些非ASCII字符,导致输出的JSON字符串中中文汉字显示为乱码或者\u编码形式。本资料主要探讨如何在使用`json_encode`时避免中文汉字被转义,从而...
需要注意的是,`json_encode()`函数要求输入的数据是UTF-8编码的,否则可能会导致乱码或返回`null`。因此,在处理包含非UTF-8编码字符的数据时,需要先进行转换。 2. 索引数组与关联数组: PHP中的数组分为索引...
当我们处理包含中文字符的JSON时,可能会遇到编码问题,导致中文乱码。这篇博文"PHP JSON显示中文"将探讨如何正确处理这个问题。 首先,我们来了解Services_JSON类。Services_JSON是PHP的一个旧版JSON编码和解码库...
如果PHP原始数据的编码不是UTF-8,那么直接使用json_encode()进行编码时,中文字符很可能被错误地编码或显示为null,导致数据传输时出现乱码。 为了解决这个中文乱码问题,通常的方法是在调用json_encode()之前使用...
在PHP中处理MSSQL数据库中的JSON数据时,可能会遇到中文乱码的问题,尤其是在数据库与PHP脚本编码不一致的情况下。本文将详细讲解如何解决这个问题。 首先,问题的背景是PHP脚本使用UTF-8编码,而MSSQL数据库可能...
因此,如果MySQL查询结果包含汉字且未正确设置字符编码,`json_encode`可能会导致乱码或无法解码的错误。为了解决这个问题,我们需要确保以下几个关键点: 1. **数据库编码**:确保MySQL数据库、数据表以及字段的...
在PHP中,`json_encode`函数用于将数组或对象编码为JSON格式的字符串,这是在Web开发中用于数据传输非常常见的操作。然而,中文字符在使用`json_encode`时可能会出现乱码的问题,特别是当网页编码(通常是UTF-8)和...
下面是一个具体的PHP代码示例,它展示了如何解决json_decode乱码和null的问题: ```php if(file_exists($result['save_path'])){ $contents=file_get_contents($result['save_path']);//将一个文件的内容写入,文件...
在PHP中,可以使用`iconv`进行编码转换,或使用`urlencode`和`urldecode`进行URL编码解码,来避免`json_encode`造成的乱码问题。在实际开发中,还需要注意前端和后端的编码一致性,确保数据在整个流程中的正确传递。
PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码,当读取数据库数据时,使用php自带的json_encode()返回到...下面脚本之家小编给大家介绍PHP读取mssql json数据中文乱码的解决办法,需要的朋友一起学习
`urlencode`可以确保非ASCII字符正确编码,避免在JSON中出现乱码。但需要注意的是,JSON标准本身并不需要对字符串进行URL编码,这里可能是为了应对特定的安全问题或者编码兼容性考虑。 `jsonFormat` 函数则是用来...