2015-04-01 11:42 GMT+02:00 Nick Knutov <[email protected]>: > Вместо 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 mailing list [email protected] | http://moscow.pm.org
