Методы написания символов Юникода
Для написания символа Юникода в интерполируемых строках,
для кодовых точек выше 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