01.04.2015 12:42, Nick Knutov пишет:
ок, код вырван из контекста для минимизации.
Вместо say у меня на самом деле отдается всё по хттп (с тем же
результатом) И, в большинстве случаев, всё это в Dancer1, в котором при
любом раскладе кодировка ломается и только его собственный to_json можно
заставить отдавать строчки в юникоде ничего не ломая, но иногда
непонятными методами.
Хочется понять как понимать когда и где происходит двойное кодирование и
как его избегать.
Совсем в идеале, хочется в сочетании с Dancer1 понять, как использовать
именно Cpanel::JSON::XS, чтобы на вход иметь хеш с юникодом и отдать
наружу json с юникодом. (Сейчас - назависимо от use utf8 и какого именно
- с Cpanel::JSON::XS юникод ломается).
Судя по твоей логике надо на json навесить utf8. А сделать это можно так.
1) $x = p2json($ha); utf8::decode($x); say $x;
2) say Encode::decode('UTF-8', p2json($ha));
Попробуй должно работать. Было бы интересно подойдет ли это для твоего
случая.
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'; и всё вернётся "в норму".
Что делать: из вашего вопроса не понятно, чего вы добиваетесь.
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org