[Moscow.pm] json, Dancer1, utf8

Nick Knutov mail на knutov.com
Ср Мар 11 02:05:47 PDT 2015


Столкнулся с проблемой, туплю и не могу понять почему всё так.

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) - как правильно делать все это?



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


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