PHP JSON_DECODE/JSON_ENCODE中文内容为NULL或乱码

可能用很多朋友使用json数据时利用php自带的函数JSON_DECODE/JSON_ENCODE处理中文内容时会碰到出现NULL或乱码问题,下面我来给大家介绍为什么会出现这样的问题,例:

  1. <?php
  2. $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
  3. var_dump(json_decode($json));
  4. var_dump(json_decode($json, true));
  5. ?>

输出结果

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)
}

完全正确没有任何问题,那么我们测试中文,代码如下:

  1. <?php
  2. $json = '{"a":"中国人人"}';
  3. var_dump(json_decode($json));
  4. ?>

结果:{"text":null,"status":1},后来从php手册中得出,json_encode 和 json_decode只支持utf-8编码的字符,GBK的字符要用json就得转换一下,这样我们就好办了

转换一个编码,代码如下:

  1. /*
  2. 字符串GBK转码为UTF-8,数字转换为数字。
  3. */
  4. function ct2($s){
  5. if(is_numeric($s)) {
  6. return intval($s);
  7. } else {
  8. return iconv("GBK","UTF-8",$s);
  9. }
  10. }
  11. /*
  12. 批量处理gbk->utf-8
  13. */
  14. function icon_to_utf8($s) {
  15. if(is_array($s)) {
  16. foreach($s as $key => $val) {
  17. $s[$key] = icon_to_utf8($val);
  18. }
  19. } else {
  20. $s = ct2($s);
  21. }
  22. return $s;
  23. }
  24. echo json_encode(icon_to_utf8("厦门"));

这样还是有时会有问题,后来找了一种在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来,写了个函数:

  1. /**************************************************************
  2. *
  3. * 使用特定function对数组中所有元素做处理
  4. * @param string &$array 要处理的字符串
  5. * @param string $function 要执行的函数
  6. * @return boolean $apply_to_keys_also 是否也应用到key上
  7. * @access public
  8. *
  9. *************************************************************/
  10. function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
  11. {
  12. foreach ($array as $key => $value) {
  13. if (is_array($value)) {
  14. arrayRecursive($array[$key], $function, $apply_to_keys_also);
  15. } else {
  16. $array[$key] = $function($value);
  17. }
  18. if ($apply_to_keys_also && is_string($key)) {
  19. $new_key = $function($key);
  20. if ($new_key != $key) {
  21. $array[$new_key] = $array[$key];
  22. unset($array[$key]);
  23. }
  24. }
  25. }
  26. }
  27. /**************************************************************
  28. *
  29. * 将数组转换为JSON字符串(兼容中文)
  30. * @param array $array 要转换的数组
  31. * @return string 转换得到的json字符串
  32. * @access public
  33. *
  34. *************************************************************/
  35. function JSON($array) {
  36. arrayRecursive($array, 'urlencode', true);
  37. $json = json_encode($array);
  38. return urldecode($json);
  39. }