Кириллические символы в json_encode PHP - PullRequest
14 голосов
/ 04 января 2009

Я пытаюсь кодировать массив кириллицы UTF-8 в строку JSON, используя функцию php json_encode. Пример кода выглядит следующим образом:

<?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 символов для каждого символа кириллицы. Есть ли способ получить оригинальные символы для пар ключ / значение вместо кодированных?

Ответы [ 7 ]

14 голосов
/ 23 сентября 2011

Вы не можете использовать JSON_UNESCAPED_UNICODE константу здесь?

10 голосов
/ 04 августа 2009

Я нашел это в коде Zend Framework:

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');

Не идеальное решение, но сделал работу за меня: о)

5 голосов
/ 14 августа 2014
$str = json_encode($arr, JSON_UNESCAPED_UNICODE);

Использование этого решения работало для меня с латиницей и кириллицей, с PHP 5.5

2 голосов
/ 04 января 2009

Сработало с 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;

Спасибо!

2 голосов
/ 04 января 2009

Похоже, что встроенный в PHP json_encode работает только с UTF-8, и никаких других наворотов для настройки его работы в отношении кодирования.

Я нашел Совершенно честное и сбалансированное сравнение библиотек php json в Google. Это может помочь вам. Вы можете попробовать другую библиотеку на основе таблиц здесь, если это возможно. На json.org перечислены дополнительные библиотеки PHP, с которыми вы можете поэкспериментировать.

1 голос
/ 21 февраля 2017

Это действительно старый вопрос, но я не думаю, что на него ответили правильно.

используйте что-то вроде этого:

print json_encode($array, JSON_UNESCAPED_UNICODE);
1 голос
/ 15 ноября 2012

Я имел дело с той же проблемой для турецкого ... на самом деле нам не нужно ничего делать, браузеры автоматически конвертируют их в блоки кода JS. Таким образом, самый простой способ их расшифровки - это получить их через javascript. (Ajax и т.д ...)

Кодировка Json для символов, отличных от ascii?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...