[Moscow.pm] json, Dancer1, utf8
Nick Knutov
mail на knutov.com
Ср Мар 11 11:19:16 PDT 2015
Еще больше перестал понимать как это работает, но помогло
$in = from_json( $src, { utf8 => 0 } );
(хотя я думал, что должно помочь utf8=>1 )
ps to all: мы немного увлеклись и часть писем прошла мимо рассылки,
сохранил в отквотированном.
11.03.2015 17:59, Artem Zhuravlev пишет:
> JSON нужно сказать что он работает с юникодом уже что б 2-й раз не
> кодировал в случае Dancer это делается в config.yml
>
> В случае обычного сценария при создании объекта нужно указать так что
> же что работаем с юникодом:
>
> ...
> $json = $json->utf8(1)
>
> ну или в случае если не хотим работать с объектом:
>
>
>
> для функций to_json, from_json 2-й аргумент хеш с парой { utf8 => 1|0 }
> $perl_scalar = from_json( $json_text, { utf8 => 1 } );
>
> 11 марта 2015 г., 15:40 пользователь Nick Knutov <mail на knutov.com
> <mailto:mail на knutov.com>> написал:
>
> Спасибо, это почти решило проблему. В этом случае
>
> my $aa = { a=>'b', c=>'д' };
> my $jj = to_json($aa);
> # utf8::is_utf8($jj); - returns false
> my $bb = from_json($jj);
> die Dumper($aa, $jj, $bb);
>
> $VAR1 = { 'c' => "\x{434}", 'a' => 'b' };
> $VAR2 = '{ "c" : "д", "a" : "b" }';
> $VAR3 = { 'c' => "\x{434}", 'a' => 'b' };
>
> Я не понимаю почему "д", но допустим. В реальной жизни между
> to_json и
> from_json результат сохранятся и берется из мускульной базы. Она
> тоже в
> utf8, (из приложения show variables like "%collat%" проверил - везде
> utf8_general_ci). После to_json и сохранения в базе - там нормальный
> текст с русскими буквами (проверил).
>
> Теперь берем строку из базы. Dumper говорит, что в ней
> "\x{418}\x{432}\x{430}\x{43d}\x{43e}\x{432}". utf::us_utf8 - true.
>
> Сделать from_json получается только если предварительно сделать
> utf8::encode. Правильно ли это, или лучше сделать как-то иначе, чтобы
> строку с json развернуть обратно в hashref?
>
>
>
> 11.03.2015 15:56, Artem Zhuravlev пишет:
> > engines:
> > JSON:
> > allow_blessed: '1'
> > canonical: '1'
> > convert_blessed: '1'
> > utf8: '1'
> >
> >
> > в config.yml
> >
> > 11 марта 2015 г., 13:45 пользователь Artem Zhuravlev
> > <zhuravlev.ua на gmail.com <mailto:zhuravlev.ua на gmail.com>
> <mailto:zhuravlev.ua на gmail.com <mailto:zhuravlev.ua на gmail.com>>>
> написал:
> >
> > По сути нужно хеш проверить на наличие utf8, и если таковы
> будут то
> > сделать $a = encode("utf8",$a). Я писал рекурсию которая
> проверяет
> > вложенность ну и что там скаляр массив или хеш.
> > По чему так уже не помню но давно, с таким сталкивался
> полечил таким
> > костылем. Скорее всего Проблема в JSON. И там написано
> > http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm#utf8
> <http://search.cpan.org/%7Emakamaka/JSON-2.90/lib/JSON.pm#utf8>
> >
> > получается что-то типо 2 раза перекодирует в utf8;
> > что б такого не было нужно джейсону это указать
> >
> > JSON->new->utf8(1)
> >
> > Но тут в Dancer врезан JSON как это сделать в Dancer нужно
> искать.
> >
> > Но думаю вы поняли в чем проблема.
> >
> > 11 марта 2015 г., 13:36 пользователь Artem Zhuravlev
> > <zhuravlev.ua на gmail.com <mailto:zhuravlev.ua на gmail.com>
> <mailto:zhuravlev.ua на gmail.com <mailto:zhuravlev.ua на gmail.com>>>
> написал:
> >
> > Если
> >
> > 11 марта 2015 г., 13:06 пользователь Nick Knutov
> > <mail на knutov.com <mailto:mail на knutov.com>
> <mailto:mail на knutov.com <mailto:mail на knutov.com>>> написал:
> >
> > utf8 вообще везде.
> >
> >
> >
> > 11.03.2015 15:03, Artem Zhuravlev пишет:
> > > В какой кодировке проект? И консоль куда вы все
> это выводите?
> > >
> > > 11 марта 2015 г., 12:05 пользователь Nick Knutov
> <mail на knutov.com <mailto:mail на knutov.com> <mailto:mail на knutov.com
> <mailto:mail на knutov.com>>
> > > <mailto:mail на knutov.com <mailto:mail на knutov.com>
> <mailto:mail на knutov.com <mailto:mail на knutov.com>>>> написал:
> > >
> > > Столкнулся с проблемой, туплю и не могу понять
> почему
> > всё так.
> > >
> > > 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) - как правильно делать все это?
> > >[...]
> >
> > package MyWeb::App;
> > use Dancer ':syntax';
> > use Data::Dumper;
> > use utf8;
> > use Encode;
> >
> > our $VERSION = '0.1';
> >
> > get '/' => sub {
> > template 'index';
> > };
> >
> > my $aa = { a=>'b', c=>'д' }; # тут русская буква
> > print Dumper $aa;
> > $aa->{c} = encode("utf8",$aa->{c});
> > my $jj = to_json($aa);
> > my $flag = utf8::is_utf8($jj); # returns 1
> > print Dumper $aa;
> > print Dumper $jj;
> > print "check flag = ".$flag."\n";
> > my $bb = from_json($jj);
> > print Dumper $bb;
> >
> >
> >
> > true;
> >
> >
> > ========== Результат
> >
> > tohil на tohil-G45M:~/dancer/MyWeb-App$ plackup -r
> bin/app.pl <http://app.pl>
> > <http://app.pl>
> > Watching bin/lib bin/app.pl <http://app.pl>
> <http://app.pl> for file updates.
> > $VAR1 = {
> > 'a' => 'b',
> > 'c' => "\x{434}"
> > };
> > $VAR1 = {
> > 'a' => 'b',
> > 'c' => 'д'
> > };
> > $VAR1 = "{
> > \"a\" : \"b\",
> > \"c\" : \"\x{d0}\x{b4}\"
> > }
> > ";
> > check flag = 1
> > $VAR1 = {
> > 'a' => 'b',
> > 'c' => "\x{434}"
> > };
> > [22251] core @0.000012> PLACK_ENV is set (development)
> forcing
> > PSGI handler in
> /usr/local/share/perl/5.18.2/Dancer/Handler.pm l. 35
> > [22251] core @0.001152> loading Dancer::Handler::PSGI
> handler
> > in /usr/local/share/perl/5.18.2/Dancer/Handler.pm l. 49
> > [22251] core @0.006177> loading handler
> 'Dancer::Handler::PSGI'
> > in /usr/local/share/perl/5.18.2/Dancer.pm l. 497
> > HTTP::Server::PSGI: Accepting connections at http://0:5000/
>
--
Best Regards,
Nick Knutov
http://knutov.com
ICQ: 272873706
Voice: +7-904-84-23-130
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20150311/73ba8707/attachment-0001.html>
Подробная информация о списке рассылки Moscow-pm