Не надо путать utf8::* с Encode::*. Везде рекомендуют использовать Encode, а не вручную проставлять utf8-флаги. Кроме того используя 'UTF-8' в Encode, вместо 'utf8', utf-символы кое-как, но валидируются.

On 01/16/2014 03:47 PM, Denis Sokolovsky wrote:

Вставлю і я свої 5 копійок: utf8::encode/decode нічого не перекодовують, а просто помічають скаляр як такий що містить не байти, а символи. Це дозволяє perl відповідно працювати з такими скалярами. Може такий приклад трохи прояснить ситуацію:

$ perl -MDevel::Peek -e '$x = "фів"; Dump($x); utf8::decode($x); Dump($x)'

SV = PV(0x1ceed80) at 0x1d0d4b8

  REFCNT = 1

  FLAGS = (POK,pPOK)

  PV = 0x1cfc5e0 "\321\204\321\226\320\262"\0

  CUR = 6

  LEN = 16

SV = PV(0x1ceed80) at 0x1d0d4b8

  REFCNT = 1

  FLAGS = (POK,pPOK,UTF8)

PV = 0x1cfc5e0 "\321\204\321\226\320\262"\0 [UTF8 "\x{444}\x{456}\x{432}"]

  CUR = 6

  LEN = 16


Відповідно ці функції відмінно лягають в процес описаний Турським: на вході для отримання з байтів символів викоикаємо decode, на виході для того щоб віддавати байти: encode. Додаткові опції, назразок того самого :utf8 для open просто автоматизують данну операцію.

--
Denis Sokolovsky

On Jan 16, 2014 3:24 PM, "vti" <[email protected] <mailto:[email protected]>> wrote:

    On 01/16/2014 03:09 PM, [email protected]
    <mailto:[email protected]> wrote:

            Во-первых, лучше использовать use utf8; вместо use
            encoding 'utf8';, т.к.
            согласно http://perldoc.perl.org/encoding.html
            данная прагма в 5.18+ является deprecated.

        Спасибо

            use open qw/:std :utf8/;
            use utf8;
            use CGI qw/:standard -utf8/;

        Вот как раз если добавлять :std, то ломаются данные из простой
        формы
        на данный момент рабочий вариант вот такой:

        use open qw/:utf8/;
        use utf8;
        use CGI qw/:standard -utf8/;

        Но  у него есть мелкий недостаток, он не правильно выводит
        русское название
        файла при glob("*").
        Можно конечно использовать костыль, предложенный vti, в виде
        Encode::decode('UTF-8', $_);
        Тем более, что русских файлов в принципе не желательно держать.

        Для тех кто хочет потестить (посмотреть):
        Пожалуйста http://www.ahost.com.ua/utf8/index.cgi
        FTP: admin_utf8 / utf8
        http://77.120.116.161/myadmin admin_utf8 / utf8


    Перекодировка -- это не костыль. Процитирую свои изменения в тот файл:

    Рекомендации по UTF-8:
    1. print должен быть в UTF-8: binmode(STDOUT, ":utf8");
    2. glob возвращает файл в байтах, необходимо преобразовать в UTF-8: my
    $file = Encode::decode('UTF-8', $_);
    3. при открытии файла необходимо сообщить, что мы хотим автоматически
    UTF-8: open(FILE, '<:encoding(UTF-8)', "$file");
    4. вместо use encoding 'utf-8' использовать use utf8; и только тогда,
    когда в исходном тексте программы есть UTF-8 символы (в данном
    случае есть)
    5. с базой вижу есть вариант правильный (set names +
    mysql_enable_utf8),
    надеюсь, что и в схеме стоит кодировка UTF-8 (иначе будет каша потом)

    Сократить этот список можно используя utf8::all.
    _______________________________________________
    Kiev-pm mailing list
    [email protected] <mailto:[email protected]>
    http://mail.pm.org/mailman/listinfo/kiev-pm



_______________________________________________
Kiev-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm

_______________________________________________
Kiev-pm mailing list
[email protected]
http://mail.pm.org/mailman/listinfo/kiev-pm

Ответить