PHP的json_encode中的西里尔字符

Aqu*_*laX 14 php json utf-8

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

<?php
  $arr = array(
     '????' => '?????',
     '???' => '?????'
  );
  $str = json_encode($arr);
  echo $str;
?>
Run Code Online (Sandbox Code Playgroud)

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

{"\u0435\u0434\u043d\u043e":"\u043f\u044a\u0440\u0432\u0438","\u0434\u0432\u0435":"\u0432\u0442\u043e\u0440\u0438"}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ber 14

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


Bor*_*kov 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)
Run Code Online (Sandbox Code Playgroud)

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

490:           $utf8 .= self::_utf162utf8($utf16);
Run Code Online (Sandbox Code Playgroud)

有:

490:           $utf8 .= mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
Run Code Online (Sandbox Code Playgroud)

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


cha*_*lor 7

$str = json_encode($arr, JSON_UNESCAPED_UNICODE);
Run Code Online (Sandbox Code Playgroud)

使用此解决方案对PHP 5.5的拉丁字母和西里尔字母都有效