Ответ 1
Не можете ли вы использовать константу JSON_UNESCAPED_UNICODE здесь?
Я пытаюсь кодировать массив Cyrillic UTF-8 в строку JSON, используя php-функцию json_encode. Пример кода выглядит следующим образом:
<?php
$arr = array(
'едно' => 'първи',
'две' => 'втори'
);
$str = json_encode($arr);
echo $str;
?>
Он отлично работает, но результат script представлен как:
{"\u0435\u0434\u043d\u043e":"\u043f\u044a\u0440\u0432\u0438","\u0434\u0432\u0435":"\u0432\u0442\u043e\u0440\u0438"}
который составляет 6 символов для каждого кириллического символа. Есть ли способ получить исходные символы для пар ключ/значение вместо кодированных?
Не можете ли вы использовать константу JSON_UNESCAPED_UNICODE здесь?
Я нашел это в коде схемы 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)
Похоже, что PHP, встроенный в json_encode
, работает только с UTF-8
, и никаких других колоколов и свистков для настройки того, как это работает в отношении кодирования.
Я нашел Полностью справедливое и сбалансированное сравнение php json libraries в Google. Это может помочь вам. Если возможно, вы можете попробовать другую библиотеку на основе таблиц. Существуют дополнительные библиотеки PHP, перечисленные в json.org, с которыми вы можете экспериментировать.
Он работал с 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;
Спасибо!
Я имел ту же проблему для турецкого... действительно, нам не нужно ничего делать, чтобы браузеры автоматически конвертировали их в блоки кода JS. Таким образом, самый простой способ получить их декодирование - это получить их через javascript. (Ajax и т.д.)
$str = json_encode($arr, JSON_UNESCAPED_UNICODE);
Использование этого решения работало для меня с латинским и кириллическим алфавитом, с PHP 5.5
Это очень старый вопрос, но я не думаю, что на него был дан правильный ответ.
используйте что-то вроде этого:
print json_encode($array, JSON_UNESCAPED_UNICODE);