Калининград+7.962.2626.555

Замена JSON_UNESCAPED_UNICODE при использовании json_encode() в PHP 5.3

01.05.2013

Итак, проблема такова: имеется простейший массив

$color['0'] = "Цвет"

После выполнения

$jsonString = json_encode($color);

в переменной $jsonString будет лежать строка

{"0":"\u0426\u0432\u0435\u0442"}

В версии PHP 5.4 добавили опцию JSON_UNESCAPED_UNICODE, которая решит проблему, но ждать пока хостинг-компании обновятся до версии 5.4 времени нету, поэтому проблему нужно решить подручными способами.

Решение грубое, но на войне все средства хороши:

function json_encode_($string) {

  $arrayUtf = array('\u0410', '\u0430', '\u0411', '\u0431', '\u0412', '\u0432', '\u0413', '\u0433', '\u0414', '\u0434', '\u0415', '\u0435', '\u0401', '\u0451', '\u0416', '\u0436', '\u0417', '\u0437', '\u0418', '\u0438', '\u0419', '\u0439', '\u041a', '\u043a', '\u041b', '\u043b', '\u041c', '\u043c', '\u041d', '\u043d', '\u041e', '\u043e', '\u041f', '\u043f', '\u0420', '\u0440', '\u0421', '\u0441', '\u0422', '\u0442', '\u0423', '\u0443', '\u0424', '\u0444', '\u0425', '\u0445', '\u0426', '\u0446', '\u0427', '\u0447', '\u0428', '\u0448', '\u0429', '\u0449', '\u042a', '\u044a', '\u042b', '\u044b', '\u042c', '\u044c', '\u042d', '\u044d', '\u042e', '\u044e', '\u042f', '\u044f');

  $arrayCyr = array('А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е', 'Ё', 'ё', 'Ж', 'ж', 'З', 'з', 'И', 'и', 'Й', 'й', 'К', 'к', 'Л', 'л', 'М', 'м', 'Н', 'н', 'О', 'о', 'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у', 'Ф', 'ф', 'Х', 'х', 'Ц', 'ц', 'Ч', 'ч', 'Ш', 'ш',  'Щ', 'щ', 'Ъ', 'ъ', 'Ы', 'ы', 'Ь', 'ь', 'Э', 'э', 'Ю', 'ю', 'Я', 'я');

  return str_replace($arrayUtf,$arrayCyr,json_encode($string));
}

$jsonString = json_encode_($color);

Вот и все. Теперь $jsonString хранит нужную нам строку

{"0":"Цвет"}