<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<pre wrap="">Еще больше перестал понимать как это работает, но помогло
$in = from_json( $src, { utf8 => 0 } );
(хотя я думал, что должно помочь utf8=>1 )
ps to all: мы немного увлеклись и часть писем прошла мимо рассылки,
сохранил в отквотированном.</pre>
<br>
<br>
<div class="moz-cite-prefix">11.03.2015 17:59, Artem Zhuravlev
пишет:<br>
</div>
<blockquote
cite="mid:CADVxfb5i7XVp7XX9A+e+NgPfy9a=0aybP0gEzzRBe8=sHyURPA@mail.gmail.com"
type="cite">
<div dir="ltr">JSON нужно сказать что он работает с юникодом уже
что б 2-й раз не кодировал в случае Dancer это делается в
config.yml
<div><br>
В случае обычного сценария при создании объекта нужно указать
так что же что работаем с юникодом:</div>
<div><br>
</div>
<div>
<pre class="" style="border:1px solid rgb(136,136,136);color:rgb(0,0,0);padding:1em;background:rgb(238,238,238)"><span class="">...
$json</span> <span class="">=</span> <span class="">$json</span><span class="">-></span><span class="">utf8</span><span class="">(1</span><span class="">)</span></pre>
</div>
<div class="gmail_extra"><br>
ну или в случае если не хотим работать с объектом:<br>
<br>
<br>
<br>
для функций to_json, from_json 2-й аргумент хеш с парой { utf8
=> 1|0 }<br>
<pre class="" style="border:1px solid rgb(136,136,136);color:rgb(0,0,0);padding:1em;background:rgb(238,238,238)"> <span class="">$perl_scalar</span> <span class="">=</span> <span class="">from_json</span><span class="">(</span> <span class="">$json_text</span><span class="">,</span> <span class="">{</span> utf8 <span class="">=></span> <span class="">1</span> <span class="">}</span> <span class="">);</span></pre>
<br>
<div class="gmail_quote">11 марта 2015 г., 15:40 пользователь
Nick Knutov <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:mail@knutov.com" target="_blank">mail@knutov.com</a>></span>
написал:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Спасибо,
это почти решило проблему. В этом случае<br>
<span class=""><br>
my $aa = { a=>'b', c=>'д' };<br>
</span>my $jj = to_json($aa);<br>
# utf8::is_utf8($jj); - returns false<br>
my $bb = from_json($jj);<br>
die Dumper($aa, $jj, $bb);<br>
<br>
$VAR1 = { 'c' => "\x{434}", 'a' => 'b' };<br>
<span class="">$VAR2 = '{ "c" : "д", "a" : "b" }';<br>
</span>$VAR3 = { 'c' => "\x{434}", 'a' => 'b' };<br>
<br>
Я не понимаю почему "д", но допустим. В реальной жизни
между to_json и<br>
from_json результат сохранятся и берется из мускульной
базы. Она тоже в<br>
utf8, (из приложения show variables like "%collat%"
проверил - везде<br>
utf8_general_ci). После to_json и сохранения в базе - там
нормальный<br>
текст с русскими буквами (проверил).<br>
<br>
Теперь берем строку из базы. Dumper говорит, что в ней<br>
"\x{418}\x{432}\x{430}\x{43d}\x{43e}\x{432}". utf::us_utf8
- true.<br>
<br>
Сделать from_json получается только если предварительно
сделать<br>
utf8::encode. Правильно ли это, или лучше сделать как-то
иначе, чтобы<br>
строку с json развернуть обратно в hashref?<br>
<br>
<br>
<br>
11.03.2015 15:56, Artem Zhuravlev пишет:<br>
<span class="">> engines:<br>
> JSON:<br>
> allow_blessed: '1'<br>
> canonical: '1'<br>
> convert_blessed: '1'<br>
> utf8: '1'<br>
><br>
><br>
> в config.yml<br>
><br>
> 11 марта 2015 г., 13:45 пользователь Artem
Zhuravlev<br>
</span>> <<a moz-do-not-send="true"
href="mailto:zhuravlev.ua@gmail.com">zhuravlev.ua@gmail.com</a>
<mailto:<a moz-do-not-send="true"
href="mailto:zhuravlev.ua@gmail.com">zhuravlev.ua@gmail.com</a>>>
написал:<br>
<span class="">><br>
> По сути нужно хеш проверить на наличие utf8, и
если таковы будут то<br>
> сделать $a = encode("utf8",$a). Я писал
рекурсию которая проверяет<br>
> вложенность ну и что там скаляр массив или хеш.<br>
> По чему так уже не помню но давно, с таким
сталкивался полечил таким<br>
> костылем. Скорее всего Проблема в JSON. И там
написано<br>
> <a moz-do-not-send="true"
href="http://search.cpan.org/%7Emakamaka/JSON-2.90/lib/JSON.pm#utf8"
target="_blank">http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm#utf8</a><br>
><br>
> получается что-то типо 2 раза перекодирует в
utf8;<br>
> что б такого не было нужно джейсону это указать<br>
><br>
> JSON->new->utf8(1)<br>
><br>
> Но тут в Dancer врезан JSON как это сделать в
Dancer нужно искать.<br>
><br>
> Но думаю вы поняли в чем проблема.<br>
><br>
> 11 марта 2015 г., 13:36 пользователь Artem
Zhuravlev<br>
</span>> <<a moz-do-not-send="true"
href="mailto:zhuravlev.ua@gmail.com">zhuravlev.ua@gmail.com</a>
<mailto:<a moz-do-not-send="true"
href="mailto:zhuravlev.ua@gmail.com">zhuravlev.ua@gmail.com</a>>>
написал:<br>
<span class="">><br>
> Если<br>
><br>
> 11 марта 2015 г., 13:06 пользователь Nick
Knutov<br>
</span>> <<a moz-do-not-send="true"
href="mailto:mail@knutov.com">mail@knutov.com</a>
<mailto:<a moz-do-not-send="true"
href="mailto:mail@knutov.com">mail@knutov.com</a>>>
написал:<br>
<span class="">><br>
> utf8 вообще везде.<br>
><br>
><br>
><br>
> 11.03.2015 15:03, Artem Zhuravlev
пишет:<br>
> > В какой кодировке проект? И
консоль куда вы все это выводите?<br>
> ><br>
> > 11 марта 2015 г., 12:05
пользователь Nick Knutov <<a moz-do-not-send="true"
href="mailto:mail@knutov.com">mail@knutov.com</a>
<mailto:<a moz-do-not-send="true"
href="mailto:mail@knutov.com">mail@knutov.com</a>><br>
</span>> > <mailto:<a
moz-do-not-send="true" href="mailto:mail@knutov.com">mail@knutov.com</a>
<mailto:<a moz-do-not-send="true"
href="mailto:mail@knutov.com">mail@knutov.com</a>>>>
написал:<br>
<div>
<div class="h5">> ><br>
> > Столкнулся с проблемой,
туплю и не могу понять почему<br>
> всё так.<br>
> ><br>
> > use Dancer ':syntax';<br>
> > ...<br>
> > my $aa = { a=>'b',
c=>'д' }; # тут русская буква<br>
> > my $jj = to_json($aa);<br>
> > utf8::is_utf8($jj); #
returns 1<br>
> > my $bb = from_json($jj);<br>
> ><br>
> > Получаю Wide character in
subroutine entry. Почему?(1)<br>
> ><br>
> > Ок, грепаю рассылку, делаю<br>
> ><br>
> > my $jj = to_json($aa);<br>
> > utf8::encode($jj);<br>
> > my $bb = from_json($jj);<br>
> ><br>
> > Судя по Dumper($aa, $jj,
utf8::is_utf8($jj), $bb);<br>
> > $bb теперь такое же, как
$aa, а вот $jj в текстовом<br>
> представлении<br>
> > $VAR2 = '{<br>
> > "c" : "д",<br>
> > "a" : "b"<br>
> > }';<br>
> > т.е. содержит совсем не 'д'
Почему?(2)<br>
> ><br>
> > Почитав документацию на
модули, я подумал, что<br>
> from_json всегда ожидает<br>
> > отсутствие utf8 флага, но
есть decode_json, которая<br>
> для случая когда<br>
> > флаг есть. Ок. Делаем<br>
> > use Cpanel::JSON::XS
'decode_json';<br>
> > $cc =
Cpanel::JSON::XS::decode_json($jj);<br>
> ><br>
> > И если перед этим не было
utf8::encode($jj);, то снова<br>
> Wide character in<br>
> > subroutine entry.
ПОЧЕМУ???(3) Ведь у строки есть флаг<br>
> и decode_json,<br>
> > судя по документации,
ожидает его наличия.<br>
> ><br>
> > и (4) - как правильно делать
все это?<br>
> >[...]<br>
</div>
</div>
<span class="">
><br>
> package MyWeb::App;<br>
> use Dancer ':syntax';<br>
> use Data::Dumper;<br>
> use utf8;<br>
> use Encode;<br>
><br>
> our $VERSION = '0.1';<br>
><br>
> get '/' => sub {<br>
> template 'index';<br>
> };<br>
><br>
> my $aa = { a=>'b', c=>'д' }; # тут
русская буква<br>
> print Dumper $aa;<br>
> $aa->{c} = encode("utf8",$aa->{c});<br>
> my $jj = to_json($aa);<br>
> my $flag = utf8::is_utf8($jj); # returns 1<br>
> print Dumper $aa;<br>
> print Dumper $jj;<br>
> print "check flag = ".$flag."\n";<br>
> my $bb = from_json($jj);<br>
> print Dumper $bb;<br>
><br>
><br>
><br>
> true;<br>
><br>
><br>
> ========== Результат<br>
><br>
> tohil@tohil-G45M:~/dancer/MyWeb-App$
plackup -r bin/<a moz-do-not-send="true"
href="http://app.pl" target="_blank">app.pl</a><br>
</span>> <<a moz-do-not-send="true"
href="http://app.pl" target="_blank">http://app.pl</a>><br>
> Watching bin/lib bin/<a
moz-do-not-send="true" href="http://app.pl"
target="_blank">app.pl</a> <<a moz-do-not-send="true"
href="http://app.pl" target="_blank">http://app.pl</a>>
for file updates.<br>
<div class="">
<div class="h5">> $VAR1 = {<br>
> 'a' => 'b',<br>
> 'c' => "\x{434}"<br>
> };<br>
> $VAR1 = {<br>
> 'a' => 'b',<br>
> 'c' => 'д'<br>
> };<br>
> $VAR1 = "{<br>
> \"a\" : \"b\",<br>
> \"c\" : \"\x{d0}\x{b4}\"<br>
> }<br>
> ";<br>
> check flag = 1<br>
> $VAR1 = {<br>
> 'a' => 'b',<br>
> 'c' => "\x{434}"<br>
> };<br>
> [22251] core @0.000012> PLACK_ENV is
set (development) forcing<br>
> PSGI handler in
/usr/local/share/perl/5.18.2/Dancer/Handler.pm l. 35<br>
> [22251] core @0.001152> loading
Dancer::Handler::PSGI handler<br>
> in
/usr/local/share/perl/5.18.2/Dancer/Handler.pm l. 49<br>
> [22251] core @0.006177> loading
handler 'Dancer::Handler::PSGI'<br>
> in /usr/local/share/perl/5.18.2/Dancer.pm
l. 497<br>
> HTTP::Server::PSGI: Accepting connections
at <a moz-do-not-send="true" href="http://0:5000/"
target="_blank">http://0:5000/</a><br>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
Best Regards,
Nick Knutov
<a class="moz-txt-link-freetext" href="http://knutov.com">http://knutov.com</a>
ICQ: 272873706
Voice: +7-904-84-23-130 </pre>
</body>
</html>