charnames
СОДЕРЖАНИЕ
- ИМЯ
- СИНТАКСИС
- ОПИСАНИЕ
- СВОБОДНЫЕ СОПОСТАВЛЕНИЯ
- ПСЕВДОНИМЫ
- НАСТРОЙКА ПСЕВДОНИМОВ
- charnames::string_vianame(name)
- charnames::vianame(name)
- charnames::viacode(code)
- НАСТРОЙКА ПЕРЕВОДЧИКОВ
- ОШИБКИ
ИМЯ
charnames - доступ к именам и именованным последовательностям символов Юникода; также определяет имена символов
СИНТАКСИС
use charnames ':full';
print "\N{GREEK SMALL LETTER SIGMA} is called sigma.\n";
print "\N{LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW}",
" is an officially named sequence of two Unicode characters\n";
use charnames ':loose';
print "\N{Greek small-letter sigma}",
"can be used to ignore case, underscores, most blanks,"
"and when you aren't sure if the official name has hyphens\n";
use charnames ':short';
print "\N{greek:Sigma} is an upper-case sigma.\n";
use charnames qw(cyrillic greek);
print "\N{sigma} is Greek sigma, and \N{be} is Cyrillic b.\n";
use utf8;
use charnames ":full", ":alias" => {
e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
mychar => 0xE8000, # Private use area
"自転車に乗る人" => "BICYCLIST"
};
print "\N{e_ACUTE} is a small letter e with an acute.\n";
print "\N{mychar} allows me to name private use characters.\n";
print "And I can create synonyms in other languages,",
" such as \N{自転車に乗る人} for "BICYCLIST (U+1F6B4)\n";
use charnames ();
print charnames::viacode(0x1234); # prints "ETHIOPIC SYLLABLE SEE"
printf "%04X", charnames::vianame("GOTHIC LETTER AHSA"); # prints
# "10330"
print charnames::vianame("LATIN CAPITAL LETTER A"); # prints 65 on
# ASCII platforms;
# 193 on EBCDIC
print charnames::string_vianame("LATIN CAPITAL LETTER A"); # prints "A" ОПИСАНИЕ
Предикат use charnames используется для доступа к именам символов Юникода и именованных последовательностей символов, а также для определения собственных имён символов и последовательностей символов.
Все формы предикатов позволяют использовать следующие 3 функции:
-
"charnames::string_vianame(имя)" для поиска имени символа или именованной последовательности символов во время выполнения, возвращая его строковое представление
-
"charnames::vianame(имя)" для поиска имени символа (но не именованной последовательности символов) во время выполнения, чтобы получить его порядковый номер (код)
-
"charnames::viacode(код)" для поиска кода символа во время выполнения, чтобы получить его имя Юникода.
Начиная с Perl v5.16, любое вхождение \N{CHARNAME} последовательностей в строке с двойными кавычками автоматически загружает этот модуль с аргументами :full и :short (описанными ниже), если он ещё не загружен с другими аргументами, чтобы скомпилировать указанный символ Юникода в позицию в строке. До версии v5.16 требовалось явное use charnames для включения этого использования. (Однако, до v5.16 форма "use charnames ();" не включала \N{CHARNAME}.)
Обратите внимание, что \N{U+...}, где ... — шестнадцатеричное число, также вставляет символ в строку. Вставляемый символ — это символ, порядковый номер (значение) которого в Юникоде равен числу. Например, "\N{U+263a}" — это эквивалент смайлика Юникода (белый фон, чёрный текст) "\N{WHITE SMILING FACE}". Также обратите внимание, что \N{...} может обозначать квантификатор регулярного выражения вместо имени символа, когда ... — число (или пара чисел через запятую (см. "КВАНТИФИКАТОРЫ" в perlreref), и не связано с этим предикатом.
Предикат charnames поддерживает аргументы :full, :loose, :short, имена скриптов и настроенные псевдонимы.
Если :full присутствует, для расширения \N{CHARNAME}, строка CHARNAME сначала ищется в списке стандартных имён символов Юникода.
:loose — это вариант :full, который позволяет CHARNAME задавать менее точно. Подробности см. в "СВОБОДНЫЕ СОПОСТАВЛЕНИЯ".
Если :short присутствует, и CHARNAME имеет вид SCRIPT:CNAME, то CNAME ищется как буква в скрипте SCRIPT, как описано в следующем абзаце. Или, если use charnames используется с аргументами имени скрипта, то для \N{CHARNAME} имя CHARNAME ищется как буква в указанных скриптах (в указанном порядке). Настроенные псевдонимы могут переопределять это, и об этом говорится в "НАСТРОЙКА ПСЕВДОНИМОВ".
Для поиска CHARNAME в данном скрипте SCRIPTNAME, этот предикат ищет в таблице стандартных имён Юникода имена
SCRIPTNAME CAPITAL LETTER CHARNAME
SCRIPTNAME SMALL LETTER CHARNAME
SCRIPTNAME LETTER CHARNAME Если CHARNAME полностью строчными буквами, то вариант CAPITAL игнорируется, иначе вариант SMALL игнорируется, и оба CHARNAME и SCRIPTNAME преобразуются в верхний регистр для поиска. Кроме этого, оба они следуют правилам свободного поиска, если :loose также указан; строгое соответствие в противном случае.
Обратите внимание, что \N{...} выполняется во время компиляции; это специальная форма строковой константы, используемой внутри строк с двойными кавычками; это означает, что вы не можете использовать переменные внутри \N{...}. Если вам нужна аналогичная функциональность во время выполнения, используйте charnames::string_vianame().
Обратите внимание, что начиная с Perl 5.18, имя BELL относится к символу Юникода U+1F514, а не к традиционному U+0007. Для последнего используйте ALERT или BEL.
Использование \N{NAME} при неизвестном значении NAME является синтаксической ошибкой.
Для \N{NAME}, это фатальная ошибка, если use bytes активен, и имя входного символа не помещается в байт (т.е., его порядковый номер выше 255).
В противном случае любая строка, содержащая \N{charname} или \N{U+code point}, автоматически будет использовать правила Юникода (см. "Семантика байтов и символов" в perlunicode).
СВОБОДНЫЕ СОПОСТАВЛЕНИЯ
Указанием :loose выбираются правила свободного сопоставления имён символов Юникода, а не строгое точное сопоставление, используемое в противном случае. Это означает, что CHARNAME не должен быть настолько точно указан. Различие в верхнем и нижнем регистре не имеет значения (кроме скриптов, как указано выше), также не имеют значения подчёркивания, и единственные тире, которые имеют значение, — это те, что в начале или в конце слова в имени (с одним исключением: тире в U+1180 HANGUL JUNGSEONG O-E имеет значение). Также неважны пробелы, не примыкающие к тире. Официальные имена Юникода весьма разнообразны в отношении использования тире или пробелов для разделения похожих на слова единиц, и этот параметр позволяет вам меньше об этом беспокоиться. Причина, по которой тире, не являющиеся средними, имеют значение, — это случаи, как U+0F60 TIBETAN LETTER -A против U+0F68 TIBETAN LETTER A. Здесь тире существенно, как и пробел перед ним, поэтому оба должны быть включены.
:loose замедляет поиск в 2–3 раза по сравнению с :full, но выгода может быть того стоить. Каждый отдельный поиск занимает очень мало времени, и результаты кэшируются, поэтому разница в скорости станет фактором только в программах, которые выполняют множество поисков различных написаний, и, вероятно, только тогда, когда эти поиски выполняются через vianame() и string_vianame(), так как поиск \N{...} выполняется во время компиляции.
ПСЕВДОНИМЫ
Начиная с Юникода 6.1 и Perl v5.16, Юникод определяет много сокращений и имён, которые ранее были расширениями Perl, и некоторые дополнительные, которые Perl ранее не принимал. Список слишком длинный, чтобы его воспроизводить здесь, но вы можете получить полный список со страницы Unicode: http://www.unicode.org/Public/UNIDATA/NameAliases.txt.
Более ранние версии Perl принимали почти все имена 6.1. Они были наиболее подробно описаны в версии pod v5.14: http://perldoc.perl.org/5.14.0/charnames.html#ALIASES.
НАСТРОЙКА ПСЕВДОНИМОВ
Вы можете добавить настраиваемые псевдонимы к стандартным (:full) соглашениям Юникода об именовании. Псевдонимы переопределяют любые стандартные определения, поэтому, если вы достаточно странный, вы можете изменить "\N{LATIN CAPITAL LETTER A}" на "B" и т.д.
Псевдонимы должны начинаться с буквенного символа. После этого каждый может содержать любую комбинацию символов слов (\w), ПРОБЕЛА (U+0020), ДЕФИСА (U+002D), ЛЕВОЙ СКОБКИ (U+0028) и ПРАВОЙ СКОБКИ (U+0029). Эти последние два никогда не должны были допускаться в именах и сохраняются только для обратной совместимости, могут быть устаревшими и удалены в будущих выпусках Perl, поэтому не используйте их для новых имён. (Более точно, первый символ имени, который вы указываете, должен соответствовать всем \p{ID_Start}, \p{Alphabetic}, и \p{Gc=Letter}. Это гарантирует, что это то, что любой разумный человек воспримет как буквенный символ. И символы продолжения, которые соответствуют \w, должны также соответствовать \p{ID_Continue}.) Начиная с Perl v5.18, можно использовать любые символы Юникода, удовлетворяющие этим критериям; до этого допускались только символы в диапазоне Latin1.
Псевдоним может отображаться либо на официальное имя символа Юникода (не имя, найденное по свободному поиску), либо на числовой код (порядковый номер). Последнее полезно для присвоения имён кодам символов в частных областях Юникода, таких как U+E800 до U+F8FF. Числовой код должен быть целым неотрицательным числом или строкой, начинающейся с "U+" или "0x", а остальная часть считается шестнадцатеричным целым числом. Литеральная числовая константа должна быть беззнаковой; она будет интерпретироваться как шестнадцатеричная, если имеет ведущий ноль или содержит недодесятичные шестнадцатеричные цифры; в противном случае она будет интерпретироваться как десятичная. Если она начинается с "U+", она интерпретируется как код символа Юникода; в противном случае интерпретируется как родной. (Только коды символов ниже 256 могут отличаться между Юникодом и родным.) Таким образом U+41 всегда является латинской буквой "A"; но 0x41 может быть "НЕРАЗРЫВНЫЙ ПРОБЕЛ" на платформах EBCDIC.
Псевдонимы добавляются либо с помощью анонимных хешей:
use charnames ":alias" => {
e_ACUTE => "LATIN SMALL LETTER E WITH ACUTE",
mychar1 => 0xE8000,
};
my $str = "\N{e_ACUTE}"; или с помощью файла, содержащего псевдонимы:
use charnames ":alias" => "pro"; Это будет пытаться прочитать "unicore/pro_alias.pl" из пути @INC. Этот файл должен возвращать список в простом Perl:
(
A_GRAVE => "LATIN CAPITAL LETTER A WITH GRAVE",
A_CIRCUM => "LATIN CAPITAL LETTER A WITH CIRCUMFLEX",
A_DIAERES => "LATIN CAPITAL LETTER A WITH DIAERESIS",
A_TILDE => "LATIN CAPITAL LETTER A WITH TILDE",
A_BREVE => "LATIN CAPITAL LETTER A WITH BREVE",
A_RING => "LATIN CAPITAL LETTER A WITH RING ABOVE",
A_MACRON => "LATIN CAPITAL LETTER A WITH MACRON",
mychar2 => "U+E8001",
); Оба этих метода автоматически вставляют ":full" в качестве первого аргумента (если не указан другой аргумент), и вы можете явно задать ":full", например
use charnames ":full", ":alias" => "pro"; ":loose" не имеет эффекта с ними. Имена ввода должны точно совпадать, используя правила ":full".
Также оба эти метода в настоящее время позволяют именовать только отдельные символы. Чтобы назвать последовательность символов, используйте настраиваемый переводчик (описанный ниже).
charnames::string_vianame(имя)
Это аналог \N{...} во время выполнения. имя может быть любым выражением, которое вычисляет имя, принимаемое \N{...} в варианте :full для charnames. Кроме того, любые другие параметры для контролирующего "use charnames" в том же объёме применяются, как :loose или любые списки скриптов, :short параметр, или настроенные псевдонимы, которые вы можете определить.
Единственные различия обусловлены тем, что string_vianame выполняется во время выполнения, а \N{} — во время компиляции. Вы не можете интерполировать внутри \N{}, (поэтому \N{$variable} не работает); и если имя входного параметра неизвестно, string_vianame возвращает undef вместо того, чтобы это было синтаксической ошибкой.
charnames::vianame(name)
Это аналогично string_vianame. Основное различие заключается в том, что в большинстве случаев vianame возвращает кодовую точку, а string_vianame — строку. Например,
printf "U+%04X", charnames::vianame("FOUR TEARDROP-SPOKED ASTERISK"); выводит «U+2722».
Это приводит к двум другим различиям. Поскольку возвращается единственная кодовая точка, функция не может обрабатывать именованные последовательности символов, поскольку они состоят из нескольких символов (для них возвращается undef). И кодовая точка может быть любой, даже такой, которая не является допустимой в соответствии с use bytes pragma,
См. "ОШИБКИ" для случаев, в которых поведение отличается от описанного выше.
charnames::viacode(code)
Возвращает полное имя символа, указанного числовым кодом. Например,
print charnames::viacode(0x2722); выводит «ЧЕТЫРЕ КАПЕЛЬКИ-СПЕЦИАЛЬНЫЕ ЗВЕЗДЫ».
Возвращаемое имя — это «лучшее» (определено ниже) официальное имя или псевдоним для кодовой точки, если доступно; в противном случае — ваш пользовательский псевдоним для неё, если он определён; в противном случае undef. Это означает, что ваш псевдоним будет возвращён только для кодовых точек, для которых нет официального имени Unicode (ни псевдонима), таких как кодовые точки для частного использования.
Если вы определите более одного имени для кодовой точки, неизвестно, какое из них будет возвращено.
Как уже упоминалось, функция возвращает undef , если для кодовой точки неизвестно имя. В Unicode правильное имя для них — пустая строка, которая undef преобразуется в строку. (Если вы запросите кодовую точку, превышающую допустимый максимальный предел Unicode U+10FFFF, для которой вы не назначили псевдоним, вы получите undef вместе с предупреждением.)
Входное число должно быть целым положительным числом или строкой, начинающейся с "U+" или "0x", при этом оставшаяся часть рассматривается как шестнадцатеричное целое число. Литеральная числовая константа должна быть беззнаковой; она будет интерпретирована как шестнадцатеричная, если у неё есть ведущий ноль или она содержит шестнадцатеричные цифры, отличные от десятичных; в противном случае она будет интерпретирована как десятичная. Если она начинается с "U+", она интерпретируется как кодовая точка Unicode; в противном случае она интерпретируется как нативная. (Только кодовые точки ниже 256 могут отличаться между Unicode и нативным представлением.) Таким образом, U+41 всегда является латинской буквой «A»; но 0x41 может быть «ПРОБЕЛ НЕРАЗРЫВНЫЙ» на платформах EBCDIC.
Как упоминалось выше в разделе "ПСЕВДОНИМЫ", Unicode 6.1 определяет дополнительные имена (синонимы или псевдонимы) для некоторых кодовых точек, большинство из которых уже были доступны в качестве расширений Perl. Все они принимаются \N{...} и другими функциями в этом модуле, но viacode должен выбрать одно имя для возврата для заданной кодовой точки, поэтому он возвращает «лучшее» имя. Чтобы понять, как это работает, полезно узнать больше о свойствах имён Unicode. Все кодовые точки фактически имеют только одно имя, которое (начиная с Unicode 2.0) никогда не может измениться после того, как символ был назначен кодовой точке. Но были допущены ошибки при назначении имён, например, иногда при публикации стандарта была допущена опечатка, в результате чего слова были написаны неправильно, и исправить это было невозможно. В конце концов, было создано свойство Name_Alias для решения этих ситуаций. Если имя было неверным, для него был опубликован исправленный синоним с помощью Name_Alias. viacode вернёт этот исправленный синоним как «лучшее» имя для кодовой точки. (Даже возможно, хотя этого ещё не произошло, что сама поправка потребует исправления, и поэтому для этой кодовой точки может быть создан другой Name_Alias; viacode вернёт самое последнее исправление.)
Имя Unicode для каждого управляющего символа (такого как LINE FEED) — пустая строка. Однако почти все они имели имена, назначенные другими стандартами, например, стандартом ASCII, или были широко распространены. viacode возвращает эти имена как «лучшие» из имеющихся. Unicode 6.1 создал Name_Aliases для каждого из них, включая альтернативные имена, такие как NEW LINE. viacode использует исходное имя «LINE FEED» вместо альтернативного. Аналогично, имя, возвращаемое для U+FEFF, — «ПРОБЕЛ ШИРИНОЙ НУЛЬ НЕРАЗРЫВНЫЙ», а не «BYTE ORDER MARK».
До Unicode 6.1 у 4 управляющих символов U+0080, U+0081, U+0084 и U+0099 не было имён и псевдонимов. Для сохранения обратной совместимости любой псевдоним, который вы определите для этих кодовых точек, будет возвращён этой функцией, в приоритете перед официальным именем.
У некоторых кодовых точек также есть сокращённые имена, такие как «LF» или «NL». viacode никогда не возвращает их.
Поскольку в будущих выпусках Unicode может быть добавлено исправление имени, имя, которое viacode возвращает, может измениться в результате. Это редкое событие, но оно происходит.
КАСТОМИЗИРОВАННЫЕ ПЕРЕВОДЧИКИ
Механизм перевода \N{...} эскейпов общий и не жёстко прописан в charnames.pm. Модуль может установить пользовательские переводы (в пределах области, в которой use модуль) с помощью следующего магического заклинания:
sub import {
shift;
$^H{charnames} = \&translator;
} Здесь translator() — подпрограмма, которая принимает CHARNAME в качестве аргумента и возвращает текст для вставки в строку вместо \N{CHARNAME} эскейпа.
Это единственный способ создать пользовательскую именованную последовательность кодовых точек.
Поскольку вставляемый текст должен быть другим в bytes режиме и вне его, функция должна проверять текущее состояние bytes-флага, как в:
use bytes (); # for $bytes::hint_bits
sub translator {
if ($^H & $bytes::hint_bits) {
return bytes_translator(@_);
}
else {
return utf8_translator(@_);
}
} См. "КАСТОМИЗИРОВАННЫЕ ПСЕВДОНИМЫ" выше для ограничений на CHARNAME.
Конечно, vianame, viacode, и string_vianame также нужно будет переопределить.
ОШИБКИ
vianame() обычно возвращает кодовую точку, но когда имя входного параметра имеет вид U+..., он возвращает chr вместо этого. В этом случае, если use bytes активен и символ не помещается в байт, он возвращает undef и выводит предупреждение.
Поскольку оценка функции перевода (см. "КАСТОМИЗИРОВАННЫЕ ПЕРЕВОДЧИКИ") происходит посреди компиляции (литерала строки), функция перевода не должна выполнять eval или require. Это ограничение должно быть снято (но имеет низкий приоритет) в будущей версии Perl.
© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/charnames