[Moscow.pm] json, Dancer1, utf8

Nick Knutov mail на knutov.com
Ср Мар 11 11:26:42 PDT 2015


Он там есть. 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