Json_encode и кириллица

10/24/2012, автор admin, категории Web-разработка

Столкнулся с такой проблемой, что json_encode при кодировании символов кириллицы преобразует её в 16-тиричный вид.

Например, массив вида:

Array(
 [0] => Array(
	  [id] => 5
	  [name] => Россия
	)
 [1] => Array(
		[id] => 16
		[name] => Китай
	)
 [2] => Array(
			[id] => 23
			[name] => Япония
		)
)

после обработки функцией json_encode, принимает вид:

"[{"id":"5","name":"\u0412\u0438\u043a\u0442\u043e\u0440\u0438\u044f"},{"id":"16","name":"\u0417\u0430\u043f\u0430\u0434\u043d\u0430\u044f \u0410\u0432\u0441\u0442\u0440\u0430\u043b\u0438\u044f"},{"id":"23","name":"\u041a\u0438\u043d\u0441\u043b\u0435\u043d\u0434"}]"

Вроде ничего страшного, но данные в таком виде расходуют лишний трафик, что особенно критично если вам нужно быстро обрабатывать ajax запросы

Для приведения строк к нормальному виду, есть следующее решение:

preg_replace_callback(
  '/\\\u([0-9a-fA-F]{4})/',
  create_function('$match', 'return mb_convert_encoding("&#" . intval($match[1], 16) . ";", "UTF-8", "HTML-ENTITIES");'),
json_encode($region_list)
)

В результате получим следующий json:

[{"id":"5","name":"Россия"},{"id":"16","name":"Китай"},{"id":"23","name":"Япония"}]

Можно прочесть также:

3 комментариев “Json_encode и кириллица”

  1. Сергей:

    Волшебная константа во втором параметре дает тот же эффект.
    Странно что инфы мало по этому поводу. Нашел что это новая фишка в PHP 5.4

    json_encode(«привет, мир!»,JSON_UNESCAPED_UNICODE)

  2. admin:

    предполагал что вторым параметром должно что то такое передаваться, перерыл все маны, но для php 5.2 так и не нашел.
    спасибо

  3. Александр:

    Сергей, огромное спасибо! Весь день сегодня убил на поиски проблемы думал что с кодировкой беда. А беда была в JSONе)