[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