March 2010 Archives

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

perluniintro - Юникод в Perl: введение

Документ дает общее представление о кодировке Юникод(анг. Unicode) и о том, как Юникод используется в Perl.

Unicode

Юникод представляет собой стандарт кодирования символов, который планирует систематезировать почти все письменности мира, плюс множество других символов.

Юникод и ISO/IEC 10646 согласовали стандарты, которые представляют коды для символов большинства современных стандартов кодирования, охватывающих более чем 30 письменностей и сотни языков, включая все коммерчески-важные современные языки. Все символы крупнейших китайских, японских и корейских словарей так же кодируются. В конечном счете будут стандартизированы практически все символы в более чем 250 письменностей и тысяч языков. Юникод 1.0 был выпущен в октябре 1991, в настоящий момент последняя версия 5.2.

Символ Юникода - абстрактное понятие. Он не привязан к какой-либо постоянной величине числа. Юникод нейтрален к языку и его отображению: он не кодирует язык текста, не определяет шрифты и другие детали графического отображения. Юникод оперирует над символами и над построением текста из этих символов.

Юникод определяет символы, такие как LATIN CAPITAL LETTER A или GREEK SMALL LETTER ALPHA и их уникальные числа, например вышеприведенным символам соответствуют их числовые представления 0x0041 и 0x03b1. Эти уникальные числа назваются - коды символов.

Стандарт Юникода предпочитает использование шестнадцатеричного представления кодов. Если такие номера как 0x0041 вам не знакомы, загляните в раздел, Шестнадцатеричное представление. В стандарте Юникода используется обозначение такое как U+0041 LATIN CAPITAL LETTER A, чтобы указать шестнадцатеричный код и нормативное имя символа.

Юникод также определяет различные свойства для символов, такие как "прописной" или "строчный", "десятичное число", или "знак препинания". Эти свойства независимы от имен символов. Кроме того, определены различные операции над символами такие как "Возведение в верхний регистр" или "Возведение в нижний регистр", и упорядочивание(сортировка) (анг. collating).

Логический "символ" Юникода может на самом деле состоять из более чем одного внутренннего фактического "символа" или кода. Для западных языков символы Юникода корректно моделируются на основе базовых символов (например, LATIN CAPITAL LETTER A) c дополнительными модификаторами (например, COMBINING ACUTE ACCENT). Такая последовательность базовых символов и модификаторов называется последовательностью комбинированных символов(combining character sequence). Некоторые не западные языки требуют более сложных моделей, поэтому Юникод создал концепцию - кластеры графем (анг. grapheme cluster) и затем рассширенные кластеры графем. К примеру, слог корейской письменности Хангыль считается одним логическим символом, но чаще всего состоит из трех символов Юникода: после ведущего согласного следует внутренний гласный после которого в свою очередь следует конечный согласный.

Будем называть эти расширенные кластеры графем "символами", относительно их внешнего представления. Как программист, вы будете стремиться оперировать отдельными элементами (или символами) кластера, хотя с точки зрения пользователя кластер графем будет восприниматься как один символ.

В этом документе мы будем подразумевать под словом "символ" - символ Юникода.

Для некоторых сочетаний есть их монолитные (precomposed) варианты. Например, LATIN CAPITAL LETTER A WITH ACUTE определяется как один код. Однако, монолитные варианты символов имеются только для некоторых сочетаний, и в основном предназначены для поддержки прямой и обратной совместимости между Юникодом и традиционными стандартами(например, ISO 8859). В общем случае, составной метод (composing method) более расширяем. Для поддержки преобразования между различными составными символами определены формы нормализации для приведения текста к определенному стандарту.

Юникод определяет несколько форм кодировок символов (character encoding forms), из которых UTF-8 наиболее популярна. UTF-8 - кодировка переменной ширины, в которой символы кодируются от 1 до 6 байтов. Кроме UTF-8 развиваются стандарты кодировок UTF-16 и UTF-32. ISO/IEC 10646 определяет аналогичные формы кодирования UCS-2 (аналогичен UTF-16) и UCS-4 (аналогичен UTF-32).

Подробнее о кодировках см. в документе perlunicode.

Продолжение следует ...

Statistic

About this Archive

This page is an archive of entries from March 2010 listed from newest to oldest.

February 2010 is the previous archive.

June 2010 is the next archive.

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