php的json_encode不支持JSON_UNESCAPED_UNICODE解决办法

七月 03, 2019 | views
Comments 0

json_encode在php5.4之前对中文的处理还是有一些问题了,但在php5.4之后我们可以利用JSON_UNESCAPED_UNICODE来让json更好的支持中文了,下面来看看具体的步骤。

我们知道, 用PHP的json_encode来处理中文的时候, 中文都会被编码, 变成不可读的, 类似”\u***”的格式, 还会在一定程度上增加传输的数据量.

  1. <?php 
  2. echo json_encode("中文"); 
  3.  
  4. //"\u4e2d\u6587" 
  5. ?> 

这就让我们这些在天朝做开发的同学, 很是头疼, 有的时候还不得不自己写json_encode.

而在PHP5.4, 这个问题终于得以解决,Json新增了一个选项:JSON_UNESCAPED_UNICODE,故名思议,就是说,Json不要编码Unicode.

看下面的例子:

  1. <?php 
  2. echo json_encode("中文", JSON_UNESCAPED_UNICODE); 
  3.  
  4. //"中文" 
  5. ?> 

怎么样,是不是让大家很开心的改动? 呵呵,当然,Json在5.4还加入了:JSON_BIGINT_AS_STRING,JSON_PRETTY_PRINT,JSON_UNESCAPED_SLASHES等选项

PHP5.4才支持JSON_UNESCAPED_UNICODE这个参数,此参数是让中文字符在json_encode的时候不用转义,减少数据传输量,但在PHP5.3中,就得自己写个函数来实现,以下就是解决方法.

  1. /** 
  2. * 对变量进行 JSON 编码 
  3. * @param mixed value 待编码的 value,除了resource 类型之外,可以为任何数据类型,该函数只能接受 UTF-8 编码的数据. 
  4. * @return string 返回 value 值的 JSON 形式 
  5. */ 
  6. function json_encode_ex($value
  7.     if (version_compare(PHP_VERSION,'5.4.0','<')) 
  8.     { 
  9.         $str = json_encode($value); 
  10.         $str = preg_replace_callback( 
  11.                                     "#\\\u([0-9a-f]{4})#i"
  12.                                     function($matchs
  13.                                     { 
  14.                                          return iconv('UCS-2BE''UTF-8', pack('H4'$matchs[1])); 
  15.                                     }, //phpfensi.com 
  16.                                      $str 
  17.                                     ); 
  18.         return $str
  19.     } 
  20.     else 
  21.     { 
  22.         return json_encode($value, JSON_UNESCAPED_UNICODE); 
  23.     } 
  24. }



zend