[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