UTF8 vs ASCII in json_encode()

Апрель 22, 2013

Автор: Блынский Никита
студент 4 курса колледжа

Здравствуйте. Я хочу рассказать о решении проблемы, с которой я столкнулся: недавно, при разработке проекта, возникла проблема с получением данных от WEB-сервера в формате JSON.
JSON — простой иерархический формат, независимый от языка и платформы. JSON предлагается как альтернатива XML.
Конечно, на все 100% заменить XML он не может, т.к. не поддерживает схем проверки, не может самостоятельно информировать о своей кодировке и не имеет понятия атрибутов, но легко его заменит там, где этими недостатками можно пренебречь. Также как и XML, JSON является самодокументирующимся форматом, описывающим структуру данных и не занимающихся их представлением.

Проблема

Проблема заключается в том, что PHP-функция json_encode() возвращает набор данных JSON, содержащий набор ASCII-символов кириллической фразы, вместо самой фразы в кодировке UTF-8.

Давайте разберем пример :
Пусть php массив будет выглядеть так :

Результатом «обёртывания» данного массива функцией json_encode() будет следующий набор JSON данных:

{
 "name":"\u0418\u0432\u0430\u043d",
 "fam":"\u041f\u0435\u0442\u0440\u043e\u0432"
}  

Решение

Как мы видим, кириллица не отображается в сформированном JSON наборе. После долгих безуспешных поисков в интернете, я решил написать функцию, которая будет переписывать коды ASCII в utf8.

Моя функция приминает 1 параметр — массив данных для формирования JSON. Внутри этой функции происходит преобразование принятого массива в JSON-набор из ASCII-символов. После этого в данном наборе происходит замена кодов ASCII на соответствующие им кириллические буквы. Сформируем JSON с помощью функции json_encode_fix_ASCII() :

 

И что же мы получаем ?

{
 "name":"Иван",
 "fam":"Петров"
}

 

Получился JSON с русскими буквами !
Теперь его можно парсить js скриптом либо другим более удобным для вас способом.

Данный способ мне пригодился для формирования JSON для AJAX запросов при построении приложений с WEB-интерфейсом на платформах ZendFramework и Drupal.

 

Исходный код функции

function json_encode_fix_ASCII($str) {
     $arr_replace_utf = 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');


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


     $str1 = json_encode($str);
     $str2 = str_replace($arr_replace_utf,$arr_replace_cyr,$str1);
     return $str2;
}

Комментировать

Вы должны войти для того, чтобы оставить комментарий.