[Moscow.pm] json, Dancer1, utf8

Михаил Шогин mshogin на gmail.com
Ср Мар 11 07:02:01 PDT 2015


А Perl какой?

mshogin на guinea:~/sandbox$ set | grep LANG
LANG=en_US.UTF-8
LANGUAGE=en_US:

mshogin на guinea:~/sandbox$ file -i t_dance.pl
t_dance.pl: text/plain; charset=utf-8

mshogin на guinea:~/sandbox$ cat 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
\ {
    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>
написал:

> 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 | http://moscow.pm.org
>



-- 
С уважением
Михаил Шогин.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150311/6b83708e/attachment-0001.html>


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