[Moscow.pm] utf8:all vs json

Анатолий Гришаев 0body0 на rambler.ru
Ср Апр 1 03:03:54 PDT 2015


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 <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'; и всё вернётся "в норму".
>>
>> Что делать: из вашего вопроса не понятно, чего вы добиваетесь.



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