ок, код вырван из контекста для минимизации.
Вместо say у меня на самом деле отдается всё по хттп (с тем же результатом) И, в большинстве случаев, всё это в Dancer1, в котором при любом раскладе кодировка ломается и только его собственный to_json можно заставить отдавать строчки в юникоде ничего не ломая, но иногда непонятными методами. Хочется понять как понимать когда и где происходит двойное кодирование и как его избегать. Совсем в идеале, хочется в сочетании с Dancer1 понять, как использовать именно Cpanel::JSON::XS, чтобы на вход иметь хеш с юникодом и отдать наружу json с юникодом. (Сейчас - назависимо от use utf8 и какого именно - с Cpanel::JSON::XS юникод ломается). 01.04.2015 14:28, Maxim Vuets пишет: > 2015-04-01 10:59 GMT+02:00 Nick Knutov <[email protected]>: >> use utf8::all; > ... >> say Dumper p2json($ha); >> >> $VAR1 = '{"c":"д","a":1,"b":"c"}'; >> >> Однако, если вместо uft8::all использовать просто utf8, то всё хорошо: >> >> $VAR1 = '{"c":"д","a":1,"b":"c"}'; >> >> Отсюда вопрос - почему такая фигня и что делать? > Такая фигня: потому что encode_json() отдаёт байты (всё верно, он же > сериализатор). А utf8::all, цитирую: "Filehandles are opened with > UTF-8 encoding turned on by default (including STDIN, STDOUT, > STDERR)". Потому say() повторно кодирует то, что ему дали в UTF-8. > Выходит двойное кодирование. Попробуйте добавить binmode STDOUT, > ':raw'; и всё вернётся "в норму". > > Что делать: из вашего вопроса не понятно, чего вы добиваетесь. -- Best Regards, Nick Knutov http://knutov.com ICQ: 272873706 Voice: +7-904-84-23-130 -- Moscow.pm mailing list [email protected] | http://moscow.pm.org
