perluniintro / Символы Юникода

| 0 TrackBacks

Методы написания символов Юникода

Для написания символа Юникода в интерполируемых строках, для кодовых точек выше 0xFF используется обозначение \x{...} .

my $smiley = "\x{263a}";

Этот же метод используется и в литералах регулярных выражений.

$smiley =~ /\x{263a}/;

Для генерации Юникода во время исполнения также можете использовать chr():

my $hebrew_alef = chr(0x05d0);

См. "Дополнительные ресурсы" о том, какому числовому коду соответствует каждый символ Юникода.

Для обратного преобразования символа в кодировке Юникод в его числовой номер используется функция ord().

Обратите внимание, что \x..(без {} указываются только две шестнадцатеричные цифры), \x{...}, и chr(...) для аргументов меньше чем 0x100 (десятичное 256) порождают восьмибитный символ для обеспечения обратной совместимости со старыми версиями Perl. Для аргументов 0x100 или больше, всегда производятся символы Unicode. Если необходимо, чтобы всегда производились только Юникодовые символы независимо от их числового значения, используйте pack("U", ...) вместо \x.., \x{...}, или chr().

Подключив прагму charnames, вы можете в интерполируемых строках указывать символы Юникода по их наименованию:

use charnames ':full';
my $arabic_alef = "\N{ARABIC LETTER ALEF}";

И, как упоминалось выше, с помощью функции pack() можно получить символы Unicode по их номеру в кодовой таблице.

   my $georgian_an  = pack("U", 0x10a0);

Заметим, что внутри \x{...} и \N{...} не получится использовать переменные, так как они являются константами времени компиляции. Чтобы реализовать подобную функциональность во время исполнения, используйте chr() и charnames::vianame().

Если вы хотите принудительно сделать так, чтобы результирующая строка содержала символы Юникода, используйте специальный префикс "UO". Он не использует аргументы но приводит к тому, что следующие байты будут интерпретированы как UTF-8 кодированные символы:

   my $chars = pack("U0W*", 0x80, 0x42);

С другой стороны, можно запретить интерпретацию аргументов как UTF-8 с помощью специального префикса "CO".

Обработка Юникода

Обработка Юникода в большинстве случаев очевидна: просто используйте строку как обычно. Функции подобные index(), length(), и substr(), регулярные выражения работают над символами Юникода. (см. perlunicode и perlretut).

Обратите внимание, что Perl использует кластеры графем для разбиения символов, так например

use charnames ':full';
print length("\N{LATIN CAPITAL LETTER A}\N{COMBINING ACUTE ACCENT}"), "\n";

выведет 2, а не 1. Единственным исключением является то, что регулярное выражение использует \X для сопоставления расширенных кластеров графем.

Старые кодировки

Когда объединяется строка в старой кодировке со строкой Юникод, строку в старой кодировке нужно преобразовать в Юникод. Обычно предполагается ISO 8859-1 (или EBCDIC, если это возможно).

use Encode 'decode';
$data = decode("iso-8859-3", $data); # преобразование из старой кодировки в utf-8

No TrackBacks

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

Statistic

About this Entry

This page contains a single entry by Dinar published on June 9, 2010 4:16 PM.

perluniintro/Модель Юникода в Perl was the previous entry in this blog.

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