<html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">В документации идущей с Perl касамо
Unicode: perluniintro, perlunicode везде только Encode. С
остальным согласен.<br>
<br>
On 01/17/2014 03:43 PM, Denis Sokolovsky wrote:<br>
</div>
<blockquote
cite="mid:CALGik+LiOS7wh-M2M3YCeDN_F5i6m35Z9o+bDyaPUM8=aQAk3Q@mail.gmail.com"
type="cite">
<div dir="ltr">Дозвольте не погодитись. По-перше я не бачив що б
всюди рекомендували Encode замість utf8::encode/decode - вони по
різному працюють і не можуть виключно заміщати одна одну.
По-друге все залежить від мети. utf8::decode більш строгий до
корректності utf8 строки ніж Encode, який пробує створити щось
валідне будь-що. Натомість utf8::decode не вміє займатись
перекодовуванням з будь-чого в utf8. Ось простий приклад, що
демострує строгість utf8::decode:
<div>
<div><br>
</div>
<div>
<div>$ perl -MEncode -MDevel::Peek -e '$x = "фів\321"; print
"Original\n"; Dump($x); print "Encode/utf8\n";
Dump(Encode::decode("UTF-8", $x)); utf8::decode($x);
Dump($x);'</div>
<div>Original</div>
<div>SV = PV(0x92f7750) at 0x9313f08</div>
<div> REFCNT = 1</div>
<div> FLAGS = (POK,pPOK)</div>
<div> PV = 0x930f5b8 "\321\204\321\226\320\262\321"\0</div>
<div> CUR = 7</div>
<div> LEN = 12</div>
<div>Encode/utf8</div>
<div>SV = PV(0x92f7d60) at 0x93935d0</div>
<div> REFCNT = 1</div>
<div> FLAGS = (TEMP,POK,pPOK,UTF8)</div>
<div> PV = 0x939ae78
"\321\204\321\226\320\262\357\277\275"\0 [UTF8
"\x{444}\x{456}\x{432}\x{fffd}"]</div>
<div> CUR = 9</div>
<div> LEN = 12</div>
<div>SV = PV(0x92f7750) at 0x9313f08</div>
<div> REFCNT = 1</div>
<div> FLAGS = (POK,pPOK)</div>
<div> PV = 0x930f5b8 "\321\204\321\226\320\262\321"\0</div>
<div> CUR = 7</div>
<div> LEN = 12</div>
</div>
</div>
<div><br>
</div>
<div>Відповідно функція is_utf8 для результату Encode видає
true, а після utf8::decode строка так і не стала utf8. Я
погоджуюсь що для більшості веб задач варто все ж таки
використовувати Encode (особливо коли мова стосується данних
від користувача) тому що вона майже наглухо fail-proof, але то
не є панацея.</div>
<div><br>
</div>
</div>
<div class="gmail_extra"><br>
<br>
<div class="gmail_quote">2014/1/16 vti <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:viacheslav.t@gmail.com" target="_blank">viacheslav.t@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div bgcolor="#FFFFFF" text="#000000">
<div>Не надо путать utf8::* с Encode::*. Везде рекомендуют
использовать Encode, а не вручную проставлять
utf8-флаги. Кроме того используя 'UTF-8' в Encode,
вместо 'utf8', utf-символы кое-как, но валидируются.
<div>
<div class="h5"><br>
<br>
On 01/16/2014 03:47 PM, Denis Sokolovsky wrote:<br>
</div>
</div>
</div>
<div>
<div class="h5">
<blockquote type="cite">
<div dir="ltr">
<p dir="ltr">Вставлю і я свої 5 копійок:
utf8::encode/decode нічого не перекодовують, а
просто помічають скаляр як такий що містить не
байти, а символи. Це дозволяє perl відповідно
працювати з такими скалярами. Може такий приклад
трохи прояснить ситуацію:</p>
<p dir="ltr">$ perl -MDevel::Peek -e '$x = "фів";
Dump($x); utf8::decode($x); Dump($x)'</p>
<p dir="ltr">SV = PV(0x1ceed80) at 0x1d0d4b8</p>
<p dir="ltr"> REFCNT = 1</p>
<p dir="ltr"> FLAGS = (POK,pPOK)</p>
<p dir="ltr"> PV = 0x1cfc5e0
"\321\204\321\226\320\262"\0</p>
<p dir="ltr"> CUR = 6</p>
<p dir="ltr"> LEN = 16</p>
<p dir="ltr">SV = PV(0x1ceed80) at 0x1d0d4b8</p>
<p dir="ltr"> REFCNT = 1</p>
<p dir="ltr"> FLAGS = (POK,pPOK,UTF8)</p>
<p dir="ltr"> PV = 0x1cfc5e0
"\321\204\321\226\320\262"\0 [UTF8
"\x{444}\x{456}\x{432}"]</p>
<p dir="ltr"> CUR = 6</p>
<p dir="ltr"> LEN = 16</p>
<p dir="ltr"><br>
</p>
<p dir="ltr">Відповідно ці функції відмінно
лягають в процес описаний Турським: на вході для
отримання з байтів символів викоикаємо decode,
на виході для того щоб віддавати байти: encode.
Додаткові опції, назразок того самого :utf8 для
open просто автоматизують данну операцію.<br>
</p>
<p dir="ltr">-- <br>
Denis Sokolovsky</p>
<div class="gmail_quote">On Jan 16, 2014 3:24 PM,
"vti" <<a moz-do-not-send="true"
href="mailto:viacheslav.t@gmail.com"
target="_blank">viacheslav.t@gmail.com</a>>
wrote:<br type="attribution">
<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">On
01/16/2014 03:09 PM, <a
moz-do-not-send="true"
href="mailto:my.yarnik@yandex.ru"
target="_blank">my.yarnik@yandex.ru</a>
wrote:<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">
<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">
Во-первых, лучше использовать use utf8;
вместо use encoding 'utf8';, т.к.<br>
согласно <a moz-do-not-send="true"
href="http://perldoc.perl.org/encoding.html"
target="_blank">http://perldoc.perl.org/encoding.html</a><br>
данная прагма в 5.18+ является deprecated.<br>
</blockquote>
Спасибо<br>
<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">
use open qw/:std :utf8/;<br>
use utf8;<br>
use CGI qw/:standard -utf8/;<br>
</blockquote>
Вот как раз если добавлять :std, то ломаются
данные из простой формы<br>
на данный момент рабочий вариант вот такой:<br>
<br>
use open qw/:utf8/;<br>
use utf8;<br>
use CGI qw/:standard -utf8/;<br>
<br>
Но у него есть мелкий недостаток, он не
правильно выводит русское название<br>
файла при glob("*").<br>
Можно конечно использовать костыль,
предложенный vti, в виде<br>
Encode::decode('UTF-8', $_);<br>
Тем более, что русских файлов в принципе не
желательно держать.<br>
<br>
Для тех кто хочет потестить (посмотреть):<br>
Пожалуйста <a moz-do-not-send="true"
href="http://www.ahost.com.ua/utf8/index.cgi"
target="_blank">http://www.ahost.com.ua/utf8/index.cgi</a><br>
FTP: admin_utf8 / utf8<br>
<a moz-do-not-send="true"
href="http://77.120.116.161/myadmin"
target="_blank">http://77.120.116.161/myadmin</a>
admin_utf8 / utf8<br>
</blockquote>
<br>
Перекодировка -- это не костыль. Процитирую
свои изменения в тот файл:<br>
<br>
Рекомендации по UTF-8:<br>
1. print должен быть в UTF-8: binmode(STDOUT,
":utf8");<br>
2. glob возвращает файл в байтах, необходимо
преобразовать в UTF-8: my<br>
$file = Encode::decode('UTF-8', $_);<br>
3. при открытии файла необходимо сообщить, что
мы хотим автоматически<br>
UTF-8: open(FILE, '<:encoding(UTF-8)',
"$file");<br>
4. вместо use encoding 'utf-8' использовать
use utf8; и только тогда,<br>
когда в исходном тексте программы есть UTF-8
символы (в данном случае есть)<br>
5. с базой вижу есть вариант правильный (set
names + mysql_enable_utf8),<br>
надеюсь, что и в схеме стоит кодировка UTF-8
(иначе будет каша потом)<br>
<br>
Сократить этот список можно используя
utf8::all.<br>
_______________________________________________<br>
Kiev-pm mailing list<br>
<a moz-do-not-send="true"
href="mailto:Kiev-pm@pm.org" target="_blank">Kiev-pm@pm.org</a><br>
<a moz-do-not-send="true"
href="http://mail.pm.org/mailman/listinfo/kiev-pm"
target="_blank">http://mail.pm.org/mailman/listinfo/kiev-pm</a><br>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Kiev-pm mailing list
<a moz-do-not-send="true" href="mailto:Kiev-pm@pm.org" target="_blank">Kiev-pm@pm.org</a>
<a moz-do-not-send="true" href="http://mail.pm.org/mailman/listinfo/kiev-pm" target="_blank">http://mail.pm.org/mailman/listinfo/kiev-pm</a>
</pre>
</blockquote>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
Kiev-pm mailing list<br>
<a moz-do-not-send="true" href="mailto:Kiev-pm@pm.org">Kiev-pm@pm.org</a><br>
<a moz-do-not-send="true"
href="http://mail.pm.org/mailman/listinfo/kiev-pm"
target="_blank">http://mail.pm.org/mailman/listinfo/kiev-pm</a><br>
<br>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
Denis Sokolovsky
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
Kiev-pm mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Kiev-pm@pm.org">Kiev-pm@pm.org</a>
<a class="moz-txt-link-freetext" href="http://mail.pm.org/mailman/listinfo/kiev-pm">http://mail.pm.org/mailman/listinfo/kiev-pm</a>
</pre>
</blockquote>
<br>
</body>
</html>