【问题标题】:Cyrillic characters in PHP's json_encodePHP 的 json_encode 中的西里尔字符
【发布时间】:2010-09-29 11:16:38
【问题描述】:

我正在尝试使用 php 的函数 json_encode 将 Cyrillic UTF-8 数组编码为 JSON 字符串。示例代码如下所示:

<?php
  $arr = array(
     'едно' => 'първи',
     'две' => 'втори'
  );
  $str = json_encode($arr);
  echo $str;
?>

它工作正常,但脚本的结果表示为:

{"\u0435\u0434\u043d\u043e":"\u043f\u044a\u0440\u0432\u0438","\u0434\u0432\u0435":"\u0432\u0442\u043e\u0440\u0438"}

每个西里尔字符对应 6 个字符。有没有办法获取键/值对的原始字符而不是编码字符?

【问题讨论】:

  • 当您回显字符串时,我认为这会进入 HTTP 响应。该响应使用哪种编码?有关有效的字符编码,请参阅json.org
  • 嗨试试这个 $str = json_encode($json,JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE);

标签: php utf-8 json


【解决方案1】:

你不能在这里使用JSON_UNESCAPED_UNICODE 常量吗?

【讨论】:

  • 这是在 php 5.4.0 中引入的。看起来它应该可以工作,但仍然无法确认。
【解决方案2】:

我在 Zend 框架的代码中发现了这个:

http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Json/Decoder.php

看一下函数 decodeUnicodeString(第 474 行):

 /**
     * Decode Unicode Characters from \u0000 ASCII syntax.
     *
     * This algorithm was originally developed for the
     * Solar Framework by Paul M. Jones
     *
     * @link   http://solarphp.com/
     * @link   http://svn.solarphp.com/core/trunk/Solar/Json.php
     * @param  string $value
     * @return string
     */
    public static function decodeUnicodeString($chrs)

它是静态的,您可以轻松提取它 - 只需替换行:

490:           $utf8 .= self::_utf162utf8($utf16);

与:

490:           $utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');

不是一个理想的解决方案,但为我完成了这项工作:o)

【讨论】:

    【解决方案3】:
    $str = json_encode($arr, JSON_UNESCAPED_UNICODE);
    

    在 PHP 5.5 中使用此解决方案对我来说适用于拉丁文和西里尔字母

    【讨论】:

      【解决方案4】:

      这是一个非常古老的问题,但我认为它没有得到正确回答。

      使用这样的东西:

      print json_encode($array, JSON_UNESCAPED_UNICODE);
      

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • @rahul_m 链接在哪里?
      • 我没有找到这个答案的相关类别,所以我映射到这个类别。
      【解决方案5】:

      它适用于http://pear.php.net/pepr/pepr-proposal-show.php?id=198

      在 JSON.php 中使用令人讨厌的绕过,第 298 行..

      $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
      $c += 1;
      //$utf16 = $this->utf82utf16($char);
      //$ascii .= sprintf('\u%04s', bin2hex($utf16));
      $ascii .= $char;
      

      谢谢!

      【讨论】:

      • 你是怎么知道绕过的?
      • 我自己想出来的。很明显
      【解决方案6】:

      看起来 PHP 内置于 json_encode 仅适用于 UTF-8,并且没有其他用于调整其在编码方面的工作方式的花里胡哨。

      我在 Google 上找到了A completely fair and balanced comparison of php json libraries。它可能会帮助你。如果可能,您可以尝试基于此处的表的另一个库。 json.org 列出了其他 PHP 库,您可以尝试使用它们。

      【讨论】:

        【解决方案7】:

        我正在为土耳其语处理同样的问题......实际上我们不需要做任何事情,浏览器会自动将它们转换为 JS 代码块。因此,让它们解码的最简单方法是通过 javascript 获取它们。 (Ajax 等...)

        Json encode for with non ascii characters ?

        【讨论】:

          【解决方案8】:

          您可以使用以下选项:

          json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
          

          【讨论】:

            猜你喜欢
            • 2011-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-31
            • 2016-06-15
            • 2011-11-19
            • 1970-01-01
            相关资源
            最近更新 更多