[Moscow.pm] utf8:all vs json

Nick Knutov mail на knutov.com
Ср Апр 1 02:42:16 PDT 2015


ок, код вырван из контекста для минимизации.

Вместо 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 <mail на knutov.com>:
>> 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