<div dir="ltr">А Perl какой?<br><br>mshogin@guinea:~/sandbox$ set | grep LANG<br>LANG=en_US.UTF-8<br>LANGUAGE=en_US:<br><br>mshogin@guinea:~/sandbox$ file -i <a href="http://t_dance.pl">t_dance.pl</a> <br><a href="http://t_dance.pl">t_dance.pl</a>: text/plain; charset=utf-8<br><br>mshogin@guinea:~/sandbox$ cat <a href="http://t_dance.pl">t_dance.pl</a> <br>use Dancer ':syntax';<br>use Data::Printer colored => 1;<br><br>my $aa = { a=>'b', c=>'д' }; # тут русская буква<br>p $aa;<br>my $jj = to_json($aa);<br>p $jj;<br>my $test = utf8::is_utf8($jj); # returns 1<br>p $test;<br>my $bb = from_json($jj);<br>p $bb;<br>mshogin@guinea:~/sandbox$ perl <a href="http://t_dance.pl">t_dance.pl</a> <br>\ {<br>    a   "b",<br>    c   "д"<br>}<br>"{<br>   "c" : "д",<br>   "a" : "b"<br>}<br>"<br>1<br>\ {<br>    a   "b",<br>    c   "д"<br>}<br><br>mshogin@guinea:~/sandbox$ perl -v<br><br>This is perl 5, version 14, subversion 2 (v5.14.2) built for x86_64-linux-gnu-thread-multi<br><br><br></div><div class="gmail_extra"><br><div class="gmail_quote">11 марта 2015 г., 14:04 пользователь PEF Secure <span dir="ltr"><<a href="mailto:pef-secure@yandex.ru" target="_blank">pef-secure@yandex.ru</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Wednesday, March 11, 2015 14:05:47 Nick Knutov wrote:<br>
> Столкнулся с проблемой, туплю и не могу понять почему всё так.<br>
><br>
> use Dancer ':syntax';<br>
> ...<br>
> my $aa = { a=>'b', c=>'д' }; # тут русская буква<br>
> my $jj = to_json($aa);<br>
<br>
</span>А зачем вы так делаете? Понимаю, бывают случаи, но зачем? json -- внешнее<br>
представление, как правило, его лучше, по моему мнению, иметь заенкоденым уже.<br>
Т.е. encode_json().<br>
<span class=""><br>
> utf8::is_utf8($jj); # returns 1<br>
> my $bb = from_json($jj);<br>
><br>
> Получаю Wide character in subroutine entry. Почему?(1)<br>
><br>
> Ок, грепаю рассылку, делаю<br>
><br>
> my $jj = to_json($aa);<br>
> utf8::encode($jj);<br>
> my $bb = from_json($jj);<br>
><br>
> Судя по Dumper($aa, $jj, utf8::is_utf8($jj), $bb);<br>
> $bb теперь такое же, как $aa, а вот $jj в текстовом представлении<br>
> $VAR2 = '{<br>
>    "c" : "д",<br>
>    "a" : "b"<br>
> }';<br>
> т.е. содержит совсем не 'д' Почему?(2)<br>
<br>
</span>Результат сильно напоминает двойной ен(де?)кодинг. Нужно найти в какой момент<br>
теряется баланс енкодинга-декодинга.<br>
<span class=""><br>
> Почитав документацию на модули, я подумал, что from_json всегда ожидает<br>
> отсутствие utf8 флага, но есть decode_json, которая для случая когда<br>
> флаг есть.<br>
<br>
</span>Как раз decode_json перекодирует из внешнего (бинарного) во внутренний utf8,<br>
Т.е. флага не было => стал.<br>
<br>
perl -Mutf8 -MJSON -le '$a={a=>"b", c=>"д"}; print 0+utf8::is_utf8($a->{c});<br>
print 0+utf8::is_utf8(encode_json($a))'<br>
<br>
1<br>
0<br>
<br>
perl -Mutf8 -MJSON -le '$a={a=>"b", c=>"д"}; print 0+utf8::is_utf8($a->{c});<br>
print 0+utf8::is_utf8(encode_json($a)); print<br>
0+utf8::is_utf8(decode_json(encode_json($a))->{c}); '<br>
<br>
1<br>
0<br>
1<br>
<br>
Если у Cpanel::JSON::XS есть особенности, то я не в курсе. Парой к to_json<br>
является from_json, насколько я знаю, они _не_меняют_ utf8.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
PEF Developer<br>
</font></span><div class="HOEnZb"><div class="h5">--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature">С уважением<br>Михаил Шогин.<br></div>
</div>