<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
ок, вопрос меняется:<br>
<br>
Если из-за utf8::all или неизвестно чего еще в фреймворке где-то
происходит двойное кодирование (и я точно знаю, что оно происходит),
то правильно ли, зная, что хеш в юникоде, полагать, что он будет
всегда правильно сериализован в json с невключенными utf8?<br>
<br>
use Cpanel::JSON::XS qw ();<br>
my $jsonxs = Cpanel::JSON::XS->new()-><b>utf8(undef)</b>;<br>
sub p2json {<br>
return $jsonxs->encode(shift);<br>
};<br>
<br>
Вот это работает во всех моих тестовых случаях.<br>
<br>
<br>
<div class="moz-cite-prefix">01.04.2015 14:28, Maxim Vuets пишет:<br>
</div>
<blockquote
cite="mid:CAG6DbogPv33k3rS8wST_EM5R2fZ29XtB=XKwkjVEfB=cWs_-tg@mail.gmail.com"
type="cite">
<pre wrap="">2015-04-01 10:59 GMT+02:00 Nick Knutov <a class="moz-txt-link-rfc2396E" href="mailto:mail@knutov.com"><mail@knutov.com></a>:
</pre>
<blockquote type="cite">
<pre wrap="">use utf8::all;
</pre>
</blockquote>
<pre wrap="">...
</pre>
<blockquote type="cite">
<pre wrap="">say Dumper p2json($ha);
$VAR1 = '{"c":"д","a":1,"b":"c"}';
Однако, если вместо uft8::all использовать просто utf8, то всё хорошо:
$VAR1 = '{"c":"д","a":1,"b":"c"}';
Отсюда вопрос - почему такая фигня и что делать?
</pre>
</blockquote>
<pre wrap="">
Такая фигня: потому что encode_json() отдаёт байты (всё верно, он же
сериализатор). А utf8::all, цитирую: "Filehandles are opened with
UTF-8 encoding turned on by default (including STDIN, STDOUT,
STDERR)". Потому say() повторно кодирует то, что ему дали в UTF-8.
Выходит двойное кодирование. Попробуйте добавить binmode STDOUT,
':raw'; и всё вернётся "в норму".
Что делать: из вашего вопроса не понятно, чего вы добиваетесь.
</pre>
</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>