debian-test-server:/home/php# php test1.php{"city":"\u5317\u4eac\"'\\abcd\">
当前位置:Gxlcms > PHP教程 > phpjson_encode中文编码的问题

phpjson_encode中文编码的问题

时间:2021-07-01 10:21:17 帮助过:17人阅读

  1. $a = array('city' => "北京\"'\abcd天津");
  2. echo json_encode($a) . "\n";
  3. ?>
  4. debian-test-server:/home/php# php test1.php
  5. {"city":"\u5317\u4eac\"'\\abcd\u5929\u6d25"}

需求,数据库中某个字段可以保存多个值,这样需要将数据用json编码以后保存在数据库中,用php内置的json_encode函数处理以后中文变成了unicode码(比如{"city":"\u5317\u4eac\"'\\abcd\u5929\u6d25"}),虽然网页上面能正确处理,但是从手机同步过来的数据是汉字(比如{"city":"北京\"'\\abcd天津"}),而不是unicode,为了从两个地方传递过来的数据在数据库中以相同的编码存储,现在暂时考虑将unicode码转换为汉字或是自定义一个json_encode函数,此函数不会将中文转换为unicode码。

在PHP的官方网站找到一个函数,就是将数据转换json,而且中文不会被转换为unicode码。

  1. /**

  2. * 由于php的json扩展自带的函数json_encode会将汉字转换成unicode码
  3. * 所以我们在这里用自定义的json_encode,这个函数不会将汉字转换为unicode码
  4. */
  5. function customJsonEncode($a = false) {
  6. if (is_null($a)) return 'null';
  7. if ($a === false) return 'false';
  8. if ($a === true) return 'true';
  9. if (is_scalar($a)) {
  10. if (is_float($a)) {
  11. // Always use "." for floats.
  12. return floatval(str_replace(",", ".", strval($a)));
  13. }

  14. if (is_string($a)) {

  15. static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", '"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
  16. return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
  17. } else {
  18. return $a;
  19. }
  20. }

  21. $isList = true;

  22. for ($i = 0, reset($a); $i < count($a); $i++, next($a)) {
  23. if (key($a) !== $i) {
  24. $isList = false;
  25. break;
  26. }
  27. }

  28. $result = array();

  29. if ($isList) {
  30. foreach ($a as $v) $result[] = customJsonEncode($v);
  31. return '[' . join(',', $result) . ']';
  32. } else {
  33. foreach ($a as $k => $v) $result[] = customJsonEncode($k).':'.customJsonEncode($v);
  34. return '{' . join(',', $result) . '}';
  35. }
  36. }

  37. $a = array('a' => array('c' => '中\\"\'国', 'd' => '韩国'), 'b' => '日本');

  38. echo customJsonEncode($a) . l;
  39. $b = array(array('c' => '中\\"\'国', 'd' => '韩国'), '日本');
  40. echo customJsonEncode($b) . l;
  41. ?>

输出: {"a":{"c":"中\\\"'国","d":"韩国"},"b":"日本"} [{"c":"中\\\"'国","d":"韩国"},"日本"]

人气教程排行