[Moscow.pm] json, Dancer1, utf8

Nick Knutov mail на knutov.com
Ср Май 27 15:51:37 PDT 2015


Спасибо,

мне нравится идея с IO::Interactive.

Задача, похоже, правильно звучит так:

1) во всех этих структурах надо иметь данные в представлении ютф (суть
набор байтиков), которое ожидают сторонние сервисы (хттп апи,
шаблонизаторы), однако при отладочной печати они должны печататься ввиде
текста и я не должен получать ошибок.

2) а в данном примере мне хочется чтобы from_json(to_json($aa)) было ==
$aa. Логично же, чтобы так было? В случае с from_yaml/to_yaml
оказывается именно так:

p $aa;
p to_yaml($aa);
p from_yaml(to_yaml($aa));

даст

\ {
    a   "b",
    c   "д"
}
"---
a: b
c: д
"
\ {
    a   "b",
    c   "д"
}

и никаких "Wide character in subroutine entry" нет.

Однако

p to_json($aa);
p from_json(to_json($aa));

"{
   "c" : "д",
   "a" : "b"
}
"
Wide character in subroutine entry at (eval 109) line 161.


ps: Я ошибочно предполагал, что utf8::all сделает мне магию, но
оказалось, что это не совсем так.


12.03.2015 2:07, Nikolay Mishin пишет:
> 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

-- 
Best Regards,
Nick Knutov
http://knutov.com
ICQ: 272873706
Voice: +7-904-84-23-130 



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