19

我正在尝试使用 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 个字符。有没有办法获取键/值对的原始字符而不是编码字符?

4

8 回答 8

26

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

于 2011-09-23T12:12:46.953 回答
10

我在 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)

于 2009-08-04T18:28:57.693 回答
10
$str = json_encode($arr, JSON_UNESCAPED_UNICODE);

这个解决方案的使用对我来说适用于拉丁字母和西里尔字母,PHP 5.5

于 2014-08-14T05:49:01.190 回答
3

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

使用这样的东西:

print json_encode($array, JSON_UNESCAPED_UNICODE);
于 2017-02-21T10:25:16.913 回答
2

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

我在 Google 上找到了一个完全公平和平衡的 php json 库比较。它可能会帮助你。如果可能,您可以尝试基于此处的表的另一个库。json.org上列出了其他 PHP 库,您可以进行试验。

于 2009-01-04T09:12:23.273 回答
2

它适用于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;

谢谢!

于 2009-01-04T09:58:15.040 回答
1

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

Json 用非 ascii 字符编码?

于 2012-11-15T15:25:16.277 回答
1

您可以使用以下选项:

json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
于 2020-06-06T13:47:41.600 回答