perluniintro/Модель Юникода в Perl

| 0 TrackBacks

Поддержка Юникода в Perl

Начиная с версии 5.6.0, в Perl была встроена поддержка Юникода. Однако Perl 5.8.0 - первый рекомендованный релиз для стабильной работы с Юникодом. В обслуживании релиза 5.6.1 зафиксированы множество проблем поддрежки Юникода, например регулярные выражения в данной версии не работают с Юникодом.

Начиная с Perl 5.8.0 использование use utf8 необходимо только в некоторых обстоятельствах. В более ранних версиях прагма utf8 использовалась для указания, что все операции в текущем блоке или файле должны быть Юникодовые(Unicode-aware). Эта модель оказалась неправильной или по крайней мере неуклюжей, в настоящее время поддержка Юникода осуществляется не в операциях в строковых данных. Остался только один случай, когда необходимо использовать use utf8: если ваш Perl скрипт сам закодирован в UTF-8, вы можете использовать UTF-8 в именах идентификаторов, в строках и в литералах регулярных выражений, если предварительно объявлен use utf8. Данная возможность по умолчанию не включена, поскольку в этом случае не поддерживается работа со старыми восьмибитными данными. См. utf8.

Модель Юникода в Perl

Perl поддерживает как метод работы работы со строками из восьмибитных байтов, так и со строками в кодировке Юникод. Принцип в том, что Perl пытается хранить данные в байтах пока это возможно, но в случае, когда не удается этого сделать, данные (в основном) преобразуются в кодировку Юникод. Пока есть некоторые проблемы с поддержкой Юникода - см. "Баги связанные с Юникодом".

В настоящее время, Perl внутренне использует либо восьми-битную кодировку(например Latin-1), либо по умолчанию UTF-8 для кодирования Юникодовых строк. В частности, если все символы могут быть представлены кодами до 0xFF (в числовом представлении в пределах диапазона 0..255), Perl орудует байтами, в противном случае, использует UTF-8.

Пользователю Perl, как правило, не требуется знать и заботиться о том, как Perl внутренне производит кодирование строк, но это становится актуальным при выводе Юникодовых строк в поток минуя уровень PerlIO. Таким образом, родные байты используемые внутренне (родная кодировка символов или UTF-8, по мере необходимости для каждой строки) будут выводиться в неизменном виде, c выдачей предупреждения "Wide character", если эти строки содержат символы за пределами 0x00FF.

Например,

      perl -e 'print "\x{DF}\n", "\x{0100}\x{DF}\n"'

выводит довольно бесполезное месиво байтов и UTF-8, а также предупреждение:

     Wide character in print at ...

Для вывода строк в UTF-8 следует указывать :encoding или :utf8 в выходной слой. Например

      binmode(STDOUT, ":utf8");

в этом примере программа гарантирует, что вывод будет в кодировке UTF-8, без выдачи предупреждений.

Вы можете включить автоматическую поддержку UTF-8 стандартного дескриптора файла, по умолчанию на уровне open(), и @ARGV с помощью ключа командной строки -C либо с помощью переменной окружающей среды PERL_UNICODE. Ключ -C подробнее рассматривается в perlrun.

Заметим, что это значит, что Perl будет ожидать такой же работы от других программ: если Perl полагает, что на STDIN поступают данные в формате UTF-8, он будет генерировать предупреждения если данные из внешнего источника не в UTF-8.

Все функции, в которых используется Юникод и операции ввода-вывода также требуют использования новой функциональности PerlIO. Почти все версии Perl начиная с 5.8 используют PerlIO, вы можете определить поддержку PerlIO для вашей версии Perl, командой perl -V, среди параметров о конфигурации Perl должна быть строка useperlio=define

No TrackBacks

TrackBack URL: http://blog.perl5doc.ru/mt-tb.cgi/14

Statistic

About this Entry

This page contains a single entry by Dinar published on March 26, 2010 1:50 AM.

perluniintro/Юникод was the previous entry in this blog.

perluniintro / Символы Юникода is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.