[Moscow.pm] utf8:all vs json

Maxim Vuets maxim.vuets на gmail.com
Ср Апр 1 03:11:17 PDT 2015


2015-04-01 11:42 GMT+02:00 Nick Knutov <mail на knutov.com>:
> Вместо say у меня на самом деле отдается всё по хттп (с тем же
> результатом) И, в большинстве случаев, всё это в Dancer1, в котором при
> любом раскладе кодировка ломается и только его собственный to_json можно
> заставить отдавать строчки в юникоде ничего не ломая, но иногда
> непонятными методами.

Я лишь немного работал с Dancer2, потому поправьте, если я не прав.

Dancer старается быть хитрым и следовать DWIM принципу. Обычно вы
генерите страницы, т.е. работаете с текстом. Отдаёте данные Дансеру,
он передаёт это в шаблон, генерит результат и потом кодирует его в
соответствии с глобально настроенной кодировкой (UTF-8 по-умолчанию).
Собственный to_json() действует аналогично. Знает, что ожидать и знает
что ожидают от него.

Я подозреваю, что когда вы внесли свой сериализатор, вы либо не дали
Дансеру понять, что вы уже всё как нужно закодировали сами, либо не
оправдываете ожидание снабжать Дансер только текстом.

> Хочется понять как понимать когда и где происходит двойное кодирование и
> как его избегать.

Я думаю способов не много:
-   читать документацию, там обычно указываются ожидания от входных
данных и формат исходящих
-   иначе смотреть код или в потроха фактических данных, например при
помощи Data::Peek

> Совсем в идеале, хочется в сочетании с Dancer1 понять, как использовать
> именно Cpanel::JSON::XS, чтобы на вход иметь хеш с юникодом и отдать
> наружу json с юникодом. (Сейчас - назависимо от use utf8 и какого именно
> - с Cpanel::JSON::XS юникод ломается).

Вижу два варианта.

1. Сделать и зарегистрировать в Дансере свой сериализатор (не знаю
позволяет ли он это, но думаю, да). И таким образом сохранить контракт
на формат данных.

2. Попросить [Cpanel::]JSON::XS не кодировать в UTF-8 результат, и
оставить этот шаг для Дансера. Дело в том, что encode_json() это
сокращение для JSON::XS->new->utf8->encode(). И utf8() здесь как раз и
запрашивает кодирование. Пишите JSON::XS->new->encode() вместо.

(Это всё я из документации вычитал, рекомендую.
https://metacpan.org/pod/JSON::XS)


Подробная информация о списке рассылки Moscow-pm