json_encode сосёт

В новой версии PHP, как уже было сказано, пофиксено множество неприятных вещей. Среди них и баг за номером 42 090, опубликованный аж в июле 2007. Баг этот позволял грохнуть процесс посылкой непотребного JSON-запроса. Хотя, видимо, работало это только под Ubuntu (мне не на windows ни на freebsd воиспроизвести не удалось), всё же исправление данной ошибки, несомненно, радует.

А вот json_encode() продолжает огорчать. В документации к нему написано This function only works with UTF-8 encoded data. И правда, от любых других кодировок он просто отплёвывается. Но мне это до без разницы, неприятно то, что и с UTF-8, работает он через жопу.

Вызов json_encode("русский текст") выдаёт гомосятину вида \u0440\u0443\u0441\u0441\u043a… Какого хера? Зачем работая only with UTF, выдавая строку для JS, которая так же работает всегда only UTF, кодировать всё этими идиотскими мнемониками?

Мало того, что вывод превращается в кашу, в которой не разобраться визуально при отладке, так ещё вместо 2-х байт на символ, шлём 6. Вот вам и экономия трафика за счёт ajax’а.

Так что нужно или мириться с этим или извращаться самим на PHP, как это делают люди в комментариях к документации.

Если для каких-то высоких целей универсальности и сохранения совместимости это и необходимо, почему не ввести второй аргумент функции, типа, $mneNahuyNeNujnaSovmestimost? Впрочем второй аргумент там есть: [, int $options=0], как написано, это Bitmask consisting of PHP_JSON_HEX_QUOT, PHP_JSON_HEX_TAG, PHP_JSON_HEX_AMP, PHP_JSON_HEX_APOS. Что означают все эти мракобесные константы не уточняется. Впрочем и уточнение тут не поможет — на любой вызов со вторым аргументом функция ругается json_encode() expects exactly 1 parameter, 2 given и Use of undefined constant PHP_JSON_HEX_QUOT.

Вобщем, ждём, когда adw0rd напишет новое расширение. :)

7 комментариев »

  • МэйБи… МэйБи…

    adw0rd, 1.03.2009, 2:35

  • а нельзя пройтись json_encode + htmlspecialchars_decode ? или ентитидекоде ли там.?

    зрзвгву, 4.06.2009, 13:52

  • >а нельзя пройтись json_encode + htmlspecialchars_decode ? или ентитидекоде ли там.?
    Можно написать без больших проблем свою конвертацию в JSON и из него. Но хотелось бы стандартного )

    vasa_c, 4.06.2009, 16:03

  • PHP 5.4.0
    json_encode

    JSON_BIGINT_AS_STRING, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, and JSON_UNESCAPED_UNICODE options were added.

    PHP 5.4.0 … json_encode … JSON_UNESCAPED_UNICODE …

    Когда ж тебя родненький из «бета» в релиз выпустят?! =)

    F_S, 5.10.2011, 20:09

  • F_S, на мастерхосте это всё равно бы не помогло ;)

    vasa_c, 5.10.2011, 22:29

  • Да, выбешивает этот момент при работе с json_encode(). Надо на 5.4 версии попробовать с новым аргументом — будет ли нормально работать или нет.

    GiN, 2.04.2013, 21:22

  • я проверял — норм

    vasa_c, 3.04.2013, 11:17

Leave a comment