[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