[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