<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 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 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 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 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 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 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 href="mailto:Kiev-pm@pm.org" target="_blank">Kiev-pm@pm.org</a><br>
            <a 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 href="mailto:Kiev-pm@pm.org" target="_blank">Kiev-pm@pm.org</a>
<a 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 href="mailto:Kiev-pm@pm.org">Kiev-pm@pm.org</a><br>
<a 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>