Ребята, привет всем! Я узнал, что начиная с версии PHP 5.2 была включена поддержка кодирования/декодирования данных в формате JSON на уровне самого языка. Когда я попробовал кодировать (json_encode) PHP массив в JSON для отправки клиенту, то получил следующее: [{"trn":"\u0443\u0440\u043e\u0436\u0430\u0439\u043...}] Попробовал искать в сети, информации немного и везде люди пытаются решить проблему либо разработкой собственной версии PHP кодера/декодера в JSON, либо еще какими-либо заплатками и видами конвертирования. Я, однако, от JSON ждал компактности и скорости. Вы используете JSON в PHP? Как-то можно побороть описанную мной проблему не прибегая к методам, добавляющим дополнительные "воркэраунды" на 30 строк?
FiMka Вы опечатались или действительно для декодировки использовали json_encode? Для декодирования используется json_decode.
http://ua2.php.net/manual/en/function.urldecode.php 6й пример нечто похожее решает. только в обратную сторону. Хотя я не пойму в чем проблема? JS должен нормально съесть ту строку.
PHP: function utf8_urldecode($str) { $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str)); return html_entity_decode($str,null,'UTF-8');; } echo json_encode(array(utf8_urldecode("собака"))); // ["\u0441\u043e\u0431\u0430\u043a\u0430"]
Не, ну ребята... во-первых, я же написал решает в обратную сторону (т.е. из %u0441 получает "с") во-вторых, я задал вопрос. а в-третьих, пошел я спать, смотреть буду завтра. JS должен нормально работать с ["\u0441\u043e\u0431\u0430\u043a\u0430"]
Simpliest, до завтра тогда. И в обратную сторону тоже как-то не решает, кажется, проблему: PHP: function utf8_urldecode($str) { $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str)); return html_entity_decode($str,null,'UTF-8');; } echo utf8_urldecode(json_encode(array("собака"))); // ["\u0441\u043e\u0431\u0430\u043a\u0430"] А до JavaScript у меня даже и дело-то не доходит, просто эхом вывожу из PHP. Ведь JSON - строка, ну и пускай, казалось бы, выводит ее нормально... А проблема, собственно, в том, что нечитаемо... Если на стороне клиента JS даже нормально понимает такие строки, то 1. каждый раз вместо 2-х байт на символ, передаем целых 6. 2. при отладке сложно разбираться с такими вот строками. Ну да ладно, утро вечера мудренее, разберемся общими усилиями. --- А вот, собственно, что я уже успел почитать в сети на эту тему: http://blgo.ru/blog/2009/02/28/json-encode-suxx/ (json_encode сосёт) http://yozhek10nozhek.livejournal.com/5842.html (PHP4, JSON и русский язык) http://forum.vingrad.ru/forum/s/c69...0ac0e/topic-218967/anchor-entry1983700/0.html (Проблема с руской кодировкой в функции json_encode) http://alexmuz.ru/php-json_encode/ (Реализация json_encode на PHP – русский язык UTF-8)
Подобрал вот такое вот решение: PHP: <?php function json_fix_cyr($json_str) { $cyr_chars = array ( '\u0430' => 'а', '\u0410' => 'А', '\u0431' => 'б', '\u0411' => 'Б', '\u0432' => 'в', '\u0412' => 'В', '\u0433' => 'г', '\u0413' => 'Г', '\u0434' => 'д', '\u0414' => 'Д', '\u0435' => 'е', '\u0415' => 'Е', '\u0451' => 'ё', '\u0401' => 'Ё', '\u0436' => 'ж', '\u0416' => 'Ж', '\u0437' => 'з', '\u0417' => 'З', '\u0438' => 'и', '\u0418' => 'И', '\u0439' => 'й', '\u0419' => 'Й', '\u043a' => 'к', '\u041a' => 'К', '\u043b' => 'л', '\u041b' => 'Л', '\u043c' => 'м', '\u041c' => 'М', '\u043d' => 'н', '\u041d' => 'Н', '\u043e' => 'о', '\u041e' => 'О', '\u043f' => 'п', '\u041f' => 'П', '\u0440' => 'р', '\u0420' => 'Р', '\u0441' => 'с', '\u0421' => 'С', '\u0442' => 'т', '\u0422' => 'Т', '\u0443' => 'у', '\u0423' => 'У', '\u0444' => 'ф', '\u0424' => 'Ф', '\u0445' => 'х', '\u0425' => 'Х', '\u0446' => 'ц', '\u0426' => 'Ц', '\u0447' => 'ч', '\u0427' => 'Ч', '\u0448' => 'ш', '\u0428' => 'Ш', '\u0449' => 'щ', '\u0429' => 'Щ', '\u044a' => 'ъ', '\u042a' => 'Ъ', '\u044b' => 'ы', '\u042b' => 'Ы', '\u044c' => 'ь', '\u042c' => 'Ь', '\u044d' => 'э', '\u042d' => 'Э', '\u044e' => 'ю', '\u042e' => 'Ю', '\u044f' => 'я', '\u042f' => 'Я', '\r' => '', '\n' => '<br />', '\t' => '' ); foreach ($cyr_chars as $cyr_char_key => $cyr_char) { $json_str = str_replace($cyr_char_key, $cyr_char, $json_str); } return $json_str; } echo json_fix_cyr(json_encode(array("собака","кошка"))); // ["собака","кошка"] ?> Но, блин, неужели подобные решения единственно возможные... вот тебе и JSON, интересно какие еще он может для различных символов подкинуть сюрпризы. Похоже, что $cyr_chars будет расти. Вот уже подумываю вернуться к старому доброму XML. Что посоветуете?
А если скрипт сохранен не в юникоде, а только данные из формы получает в юникоде? Тогда "А" из кода сркипта не соответствует "А" полученой из формы. Конвертируй с помощью iconv.
FiMka Все нормально работает, не надо никаких огородов. http://simpliest.co.cc/sample/jsonutf8/index.html http://simpliest.co.cc/sample/jsonutf8/ajax.php http://simpliest.co.cc/sample/jsonutf8/ajax.phps
Где работает, как работает? В JavaScript вижу, работает, но я ж написал, что не хочу гонять тучи байт клиенту (для каждого символа вместо 2-ух байт целых шесть передается), это ж JSON, экономия траффика должна быть, а не наоборот, а иначе нафиг он нужен вообще. Так-то и в XML и в обычном тексте работает. ЗЫ: прокся на работе режет, похоже, домены .co.cc, а тут еще и "пупсик", короче порадовало
Так, все спичечники свободны. Если у тебя не библиотека Мошкова с 3мб голого текста без разметки, то json отлично уменьшает трафик, минимум вдвое. Но он сделан не для компрессии данных. Для сжатия надо использовать gzip/mod_deflate
Нее, у меня, конечно, не Мошковская либа, я просто очень жадный, всё хочется лучше и лучше, но согласитесь все равно косяк... А вообще, если даже просто взглянуть на синтаксис формата JSON, то видно, что его разработчики задумывались и о компактности тоже (эти лаконичные скобочки фигурные и квадратные и прочее), но да, добиться краткости не было основной целью. Вот еще интересная статья в которой сравниваются форматы XML и JSON http://www.json.org/xml.html. Кстати, название статьи говорит само за себя "JSON - обезжиренный XML" (JSON: The Fat-Free Alternative to XML). Короче ситуация в этом отношении понятна. Итог: либо использовать XML, либо накропать собственную версию JSON decoder/encoder. А в моем случае это как раз вариант, т.к. структура передаваемых данных крайне перманента и тагирована. Всем спасибо за участие! --- JSON - reduces traffic twice for plain text, but pushes three times more odd stuff.
Код (PHP): <?php function toJson($mixed) { return preg_replace_callback( "/\\\\u([a-f0-9]{4})/", function($matches) { return iconv('UCS-4LE','UTF-8',pack('V', hexdec('U' . $matches[0]))); }, json_encode($mixed) ); }
А что столько проблем-то? Недавно столкнулся с проблемой, когда API не понимает такие вещи в json, почитал документацию по json_encode, и всего-то надо было последним параметром передать JSON_UNESCAPED_UNICODE. https://php.net/json_encode
Всё намного проще, нужно в функцию передать нужный параметр: json_encode(array('собака'), JSON_UNESCAPED_UNICODE), вот и вся магия