[Moscow.pm] json, Dancer1, utf8

TheAthlete theathlet на yandex.ru
Ср Мар 11 07:03:44 PDT 2015


Тут нужен use utf8;

perl -Mutf8 -MJSON::XS -E '$h = {a=>"b", c=>"д"}; $s = encode_json($h);  
say $s'
{"c":"д","a":"b"}

perl -MJSON::XS -E '$h = {a=>"b", c=>"д"}; $s = encode_json($h); say $s'
{"c":"д","a":"b"}

Nick Knutov <mail на knutov.com> писал(а) в своём письме Wed, 11 Mar 2015  
12:05:47 +0300:

> Столкнулся с проблемой, туплю и не могу понять почему всё так.
>
> use Dancer ':syntax';
> ...
> my $aa = { a=>'b', c=>'д' }; # тут русская буква
> my $jj = to_json($aa);
> 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, которая для случая когда
> флаг есть. Ок. Делаем
> use Cpanel::JSON::XS 'decode_json';
> $cc = Cpanel::JSON::XS::decode_json($jj);
>
> И если перед этим не было utf8::encode($jj);, то снова Wide character in
> subroutine entry. ПОЧЕМУ???(3) Ведь у строки есть флаг и decode_json,
> судя по документации, ожидает его наличия.
>
> и (4) - как правильно делать все это?
>
>
>


-- 
Написано в почтовом клиенте браузера Opera: http://www.opera.com/mail/


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