[Kiev-pm] utf8

vti viacheslav.t at gmail.com
Thu Jan 16 05:57:10 PST 2014


Не надо путать 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" <viacheslav.t ÎÁ gmail.com 
> <mailto:viacheslav.t ÎÁ gmail.com>> wrote:
>
>     On 01/16/2014 03:09 PM, my.yarnik ÎÁ yandex.ru
>     <mailto:my.yarnik ÎÁ yandex.ru> 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
>     Kiev-pm ÎÁ pm.org <mailto:Kiev-pm ÎÁ pm.org>
>     http://mail.pm.org/mailman/listinfo/kiev-pm
>
>
>
> _______________________________________________
> Kiev-pm mailing list
> Kiev-pm ÎÁ pm.org
> http://mail.pm.org/mailman/listinfo/kiev-pm

----------- ���� ���-----------
÷ÌÏÖÅÎÉÅ × ÆÏÒÍÁÔÅ HTML ÂÙÌÏ ÉÚ×ÌÅÞÅÎÏ…
URL: <http://mail.pm.org/pipermail/kiev-pm/attachments/20140116/69ff1ee6/attachment.html>


More information about the Kiev-pm mailing list