[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