[Moscow.pm] json, Dancer1, utf8

Михаил Шогин mshogin на gmail.com
Чт Мар 12 00:38:26 PDT 2015


 <http://search.cpan.org/search?mode=module&query=perldoc>perldoc perldiag
| grep -A 9 'Wide char'
       Wide character in %s
           (S utf8) Perl met a wide character (>255) when it wasn't
expecting
           one.  This warning is by default on for I/O (like print).  The
           easiest way to quiet this warning is simply to add the ":utf8"
           layer to the output, e.g. "binmode STDOUT, ':utf8'".  Another way
           to turn off the warning is to add "no warnings 'utf8';" but that
is
           often closer to cheating.  In general, you are supposed to
           explicitly mark the filehandle with an encoding, see open and
           "binmode" in perlfunc.

1. либо убрать use utf8;
2. либо binmode STDERR, ":utf8"; binmode STDOUT, ":utf8";
3. ну или так :)
no utf8;
my $aa = { a=>'b', c=> 'д' }; # тут русская
буква

use utf8;


11 марта 2015 г., 21:26 пользователь Nick Knutov <mail на knutov.com> написал:

> Он там есть. use utf8::all так же не помог. При этом from_yaml там же
> работает абсолютно нормально и прозрачно - исходный хеш в ютф,
> сериализуется в строку с ютф, в базу пишется, из базы берется,
> десериализуется нормально и на выходе везде ютф.
>
>
> 11.03.2015 19:03, TheAthlete пишет:
> > Тут нужен 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) - как правильно делать все это?
>
> --
> Best Regards,
> Nick Knutov
> http://knutov.com
> ICQ: 272873706
> Voice: +7-904-84-23-130
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>



-- 
С уважением
Михаил Шогин.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150312/806bf16f/attachment.html>


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