[Moscow.pm] json, Dancer1, utf8
PEF Secure
pef-secure на yandex.ru
Ср Мар 11 04:04:35 PDT 2015
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