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 <[email protected] > <mailto:[email protected]>> написал: > > 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 > [email protected] <mailto:[email protected]> | http://moscow.pm.org > > > > > -- > С уважением > Михаил Шогин. > > -- Best Regards, Nick Knutov http://knutov.com ICQ: 272873706 Voice: +7-904-84-23-130
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
