[Moscow.pm] json, Dancer1, utf8

Nick Knutov mail на knutov.com
Ср Мар 11 11:24:43 PDT 2015


use v5.14.

Запустил ваш код для теста и (в некоторых почтовых клиентах картинка
окажется в аттаче):



11.03.2015 19:02, Михаил Шогин пишет:
> А Perl какой?
>
> mshogin на guinea:~/sandbox$ set | grep LANG
> LANG=en_US.UTF-8
> LANGUAGE=en_US:
>
> mshogin на guinea:~/sandbox$ file -i t_dance.pl <http://t_dance.pl>
> t_dance.pl <http://t_dance.pl>: text/plain; charset=utf-8
>
> mshogin на guinea:~/sandbox$ cat t_dance.pl <http://t_dance.pl>
> use Dancer ':syntax';
> use Data::Printer colored => 1;
>
> my $aa = { a=>'b', c=>'д' }; # тут русская буква
> p $aa;
> my $jj = to_json($aa);
> p $jj;
> my $test = utf8::is_utf8($jj); # returns 1
> p $test;
> my $bb = from_json($jj);
> p $bb;
> mshogin на guinea:~/sandbox$ perl t_dance.pl <http://t_dance.pl>
> \ {
>     a   "b",
>     c   "д"
> }
> "{
>    "c" : "д",
>    "a" : "b"
> }
> "
> 1
> \ {
>     a   "b",
>     c   "д"
> }
>
> mshogin на guinea:~/sandbox$ perl -v
>
> This is perl 5, version 14, subversion 2 (v5.14.2) built for
> x86_64-linux-gnu-thread-multi
>
>
>
> 11 марта 2015 г., 14:04 пользователь PEF Secure <pef-secure на yandex.ru
> <mailto:pef-secure на yandex.ru>> написал:
>
>     On Wednesday, March 11, 2015 14:05:47 Nick Knutov wrote:
>     > Столкнулся с проблемой, туплю и не могу понять почему всё так.
>     >
>     > use Dancer ':syntax';
>     > ...
>     > my $aa = { a=>'b', c=>'д' }; # тут русская буква
>     > my $jj = to_json($aa);
>
>     А зачем вы так делаете? Понимаю, бывают случаи, но зачем? json --
>     внешнее
>     представление, как правило, его лучше, по моему мнению, иметь
>     заенкоденым уже.
>     Т.е. encode_json().
>
>     > utf8::is_utf8($jj); # returns 1
>     > my $bb = from_json($jj);
>     >
>     > Получаю Wide character in subroutine entry. Почему?(1)
>     >
>     > Ок, грепаю рассылку, делаю
>     >
>     > my $jj = to_json($aa);
>     > utf8::encode($jj);
>     > my $bb = from_json($jj);
>     >
>     > Судя по Dumper($aa, $jj, utf8::is_utf8($jj), $bb);
>     > $bb теперь такое же, как $aa, а вот $jj в текстовом представлении
>     > $VAR2 = '{
>     >    "c" : "д",
>     >    "a" : "b"
>     > }';
>     > т.е. содержит совсем не 'д' Почему?(2)
>
>     Результат сильно напоминает двойной ен(де?)кодинг. Нужно найти в
>     какой момент
>     теряется баланс енкодинга-декодинга.
>
>     > Почитав документацию на модули, я подумал, что from_json всегда
>     ожидает
>     > отсутствие utf8 флага, но есть decode_json, которая для случая когда
>     > флаг есть.
>
>     Как раз decode_json перекодирует из внешнего (бинарного) во
>     внутренний utf8,
>     Т.е. флага не было => стал.
>
>     perl -Mutf8 -MJSON -le '$a={a=>"b", c=>"д"}; print
>     0+utf8::is_utf8($a->{c});
>     print 0+utf8::is_utf8(encode_json($a))'
>
>     1
>     0
>
>     perl -Mutf8 -MJSON -le '$a={a=>"b", c=>"д"}; print
>     0+utf8::is_utf8($a->{c});
>     print 0+utf8::is_utf8(encode_json($a)); print
>     0+utf8::is_utf8(decode_json(encode_json($a))->{c}); '
>
>     1
>     0
>     1
>
>     Если у Cpanel::JSON::XS есть особенности, то я не в курсе. Парой к
>     to_json
>     является from_json, насколько я знаю, они _не_меняют_ utf8.
>
>     --
>     PEF Developer
>     --
>     Moscow.pm mailing list
>     moscow-pm на pm.org <mailto:moscow-pm на pm.org> | http://moscow.pm.org
>
>
>
>
> -- 
> С уважением
> Михаил Шогин.
>
>

-- 
Best Regards,
Nick Knutov
http://knutov.com
ICQ: 272873706
Voice: +7-904-84-23-130 

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150311/a559203a/attachment.html>
----------- следущая часть -----------
Вложение не в текстовом формате было извлечено…
Имя: beicgfhg.png
Тип: image/png
Размер: 6854 байтов
Описание: отсутствует
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150311/a559203a/attachment.png>


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