[Kiev-pm] utf8

Denis Sokolovsky ganellon at gmail.com
Thu Jan 16 05:47:49 PST 2014


Вставлю і я свої 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> wrote:

> On 01/16/2014 03:09 PM, 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
> http://mail.pm.org/mailman/listinfo/kiev-pm
>
----------- ���� ���-----------
÷ÌÏÖÅÎÉÅ × ÆÏÒÍÁÔÅ HTML ÂÙÌÏ ÉÚ×ÌÅÞÅÎÏ…
URL: <http://mail.pm.org/pipermail/kiev-pm/attachments/20140116/7ff7da0c/attachment-0001.html>


More information about the Kiev-pm mailing list