Поддержка Юникода в 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