[Moscow.pm] json, Dancer1, utf8
Nikolay Mishin
mi на ya.ru
Ср Мар 11 14:07:18 PDT 2015
Nick, привет,
сделал так
https://github.com/mishin/presentation/blob/master/t_dance.pl
use utf8;
use Encode::Locale;
use IO::Interactive qw(is_interactive);
use Dancer ':syntax';
use Data::Printer colored => 1;
sub prepare_encoding_console {
if ( is_interactive() ) {
binmode( STDIN, ":encoding(console_in)" );
binmode( STDOUT, ":encoding(console_out)" );
binmode( STDERR, ":encoding(console_out)" );
}
Encode::Locale::decode_argv();
}
prepare_encoding_console();
my $aa = { a => 'b', c => 'д' }; # тут русская буква
p $aa;
my $jj = to_json($aa);
p $jj;
my $test = utf8::is_utf8($jj); # returns 1
p $test;
my $bb = from_json($jj);
p $bb;
perl t_dance.pl
\ {
a "b",
c "д"
}
"{
"a" : "b",
"c" : "д"
}
"
1
Wide character in subroutine entry at (eval 88) line 161.
на perl -d t_dance.pl
Wide character in subroutine entry at (eval 90)[/usr/local/share/perl/5.18.2/JSON.pm:269] line 161.
at /usr/local/share/perl/5.18.2/JSON.pm line 171.
JSON::from_json('{
"a" : "b",
"c" : "д"
}
', 'HASH(0x2d725b0)') called at /usr/local/share/perl/5.18.2/Dancer/Serializer/JSON.pm line 62
Dancer::Serializer::JSON::deserialize('Dancer::Serializer::JSON=HASH(0x2d5ae58)', '{
"a" : "b",
"c" : "д"
}
') called at /usr/local/share/perl/5.18.2/Dancer/Serializer/JSON.pm line 17
Dancer::Serializer::JSON::from_json('{
"a" : "b",
"c" : "д"
}
') called at /usr/local/share/perl/5.18.2/Dancer.pm line 154
Dancer::from_json('{
"a" : "b",
"c" : "д"
}
') called at t_dance.pl line 24
У меня вопрос, а в чем стоит задача?
11.03.2015, 21:27, "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
--
С уважением
Николай Мишин
Подробная информация о списке рассылки Moscow-pm