`

php json 乱码

    博客分类:
  • json
阅读更多

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的解析也就不成问题了。比如: 返回的数据是

"\u4e2d\u56fd\u4eba"

无论你的页面是GBK,还是UTF-8的,都将可以正确解析为

“中国人"

比较简单的方式是调用Javascript的eval函数:

try{ eval("var ret = " +"\"\u4e2d\u56fd\u4eba\";");} catch(e){}; alert(ret);

再来看看S(Server)端,json_encode/json_decode会假定给定的数据是UTF-8编码的,这儿就有几种思路了:

  1. 将数据转化为UTF-8编码的,然后再调用json_encode, 或者首先json_decode,然后再转化为GBK编码的。
  2. 将数据urlencode,这样所有的数据都是ASCII的了,调用json_encode就没有问题了,json_decode之后也需要 urldecode下。
  3. 自己编写函数将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);

}

第三种方式,在这儿就不详细介绍了。

 

参考:

  1. http://gggeek.altervista.org/sw/article_20061113.html
  2. 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...

    由php对象生成json字符串 把php对象变成json字符串.zip

    JSON_UNESCAPED_UNICODE则允许保留Unicode字符,避免乱码问题。 ```php $options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE; $json = json_encode($data, $options); ``` 在处理错误时,json_last_error()...

    探讨PHP JSON中文乱码的解决方法详解

    在PHP与JSON数据交换过程中,常常会出现中文乱码的问题。这主要是因为JSON和JavaScript在客户端处理字符时默认采用UTF-8格式,而当数据库和PHP页面编码不一致时,中文字符在与JSON交互中就会出现乱码。为了解决这一...

    PHP json_encode中文乱码问题的解决办法

    然而,在使用PHP的json_encode函数进行数据编码时,常常会遇到中文乱码的问题,尤其是当涉及到中文字符编码为UTF-8时。本篇知识分享将详细解释在PHP中遇到json_encode中文乱码问题时的解决办法。 ### 1. JSON编码...

    PHP JSON_ENCODE 不转义中文汉字的方法.rar

    然而,当我们处理包含中文汉字的数据时,`json_encode`默认会转义这些非ASCII字符,导致输出的JSON字符串中中文汉字显示为乱码或者\u编码形式。本资料主要探讨如何在使用`json_encode`时避免中文汉字被转义,从而...

    在PHP语言中使用JSON

    需要注意的是,`json_encode()`函数要求输入的数据是UTF-8编码的,否则可能会导致乱码或返回`null`。因此,在处理包含非UTF-8编码字符的数据时,需要先进行转换。 2. 索引数组与关联数组: PHP中的数组分为索引...

    PHP JSON显示中文

    当我们处理包含中文字符的JSON时,可能会遇到编码问题,导致中文乱码。这篇博文"PHP JSON显示中文"将探讨如何正确处理这个问题。 首先,我们来了解Services_JSON类。Services_JSON是PHP的一个旧版JSON编码和解码库...

    PHP json_encode() 函数详解及中文乱码问题

    如果PHP原始数据的编码不是UTF-8,那么直接使用json_encode()进行编码时,中文字符很可能被错误地编码或显示为null,导致数据传输时出现乱码。 为了解决这个中文乱码问题,通常的方法是在调用json_encode()之前使用...

    PHP读取mssql json数据中文乱码的解决方法_.docx

    在PHP中处理MSSQL数据库中的JSON数据时,可能会遇到中文乱码的问题,尤其是在数据库与PHP脚本编码不一致的情况下。本文将详细讲解如何解决这个问题。 首先,问题的背景是PHP脚本使用UTF-8编码,而MSSQL数据库可能...

    PHP MYSQL 查询汉字jsonencode处理

    因此,如果MySQL查询结果包含汉字且未正确设置字符编码,`json_encode`可能会导致乱码或无法解码的错误。为了解决这个问题,我们需要确保以下几个关键点: 1. **数据库编码**:确保MySQL数据库、数据表以及字段的...

    php中json_encode UTF-8中文乱码的更好解决方法

    在PHP中,`json_encode`函数用于将数组或对象编码为JSON格式的字符串,这是在Web开发中用于数据传输非常常见的操作。然而,中文字符在使用`json_encode`时可能会出现乱码的问题,特别是当网页编码(通常是UTF-8)和...

    有关json_decode乱码及NULL的问题

    下面是一个具体的PHP代码示例,它展示了如何解决json_decode乱码和null的问题: ```php if(file_exists($result['save_path'])){ $contents=file_get_contents($result['save_path']);//将一个文件的内容写入,文件...

    php中json_encode处理gbk与gb2312中文乱码问题的解决方法

    在PHP中,可以使用`iconv`进行编码转换,或使用`urlencode`和`urldecode`进行URL编码解码,来避免`json_encode`造成的乱码问题。在实际开发中,还需要注意前端和后端的编码一致性,确保数据在整个流程中的正确传递。

    PHP读取mssql json数据中文乱码的解决办法

    PHP及网页使用UTF-8编码,数据库是sql server2008,使用默认编码,当读取数据库数据时,使用php自带的json_encode()返回到...下面脚本之家小编给大家介绍PHP读取mssql json数据中文乱码的解决办法,需要的朋友一起学习

    PHP生成嵌套JSON解决思路_.docx

    `urlencode`可以确保非ASCII字符正确编码,避免在JSON中出现乱码。但需要注意的是,JSON标准本身并不需要对字符串进行URL编码,这里可能是为了应对特定的安全问题或者编码兼容性考虑。 `jsonFormat` 函数则是用来...

Global site tag (gtag.js) - Google Analytics