charnames
СОДЕРЖАНИЕ
- ИМЯ
- СИНТАКСИС
- ОПИСАНИЕ
- СЛАБЫЕ СОПОСТАВЛЕНИЯ
- ПСЕВДОНИМЫ
- НАСТРОЕННЫЕ ПСЕВДОНИМЫ
- charnames::string_vianame(name)
- charnames::vianame(name)
- charnames::viacode(code)
- НАСТРОЕННЫЕ ТРАНСЛЯТОРЫ
- ОШИБКИ
ИМЯ
charnames - доступ к именам символов Unicode и именованных последовательностей символов; также определяет имена символов
СИНТАКСИС
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 используется для получения доступа к именам символов Unicode и именованных последовательностей символов, а также для определения собственных имён символов и последовательностей символов.
Все формы предиката позволяют использовать следующие 3 функции:
-
"charnames::string_vianame(name)" для поиска в оперативной памяти имени символа или именованной последовательности символов, возвращая его строковое представление
-
"charnames::vianame(name)" для поиска в оперативной памяти имени символа (но не именованной последовательности символов) для получения его порядкового значения (кода)
-
"charnames::viacode(code)" для поиска в оперативной памяти кода символа для получения его имени в Unicode.
Начиная с Perl v5.16, любое вхождение \N{CHARNAME} в строке с двойными кавычками автоматически загружает этот модуль с аргументами :full и :short (описанными ниже), если он ещё не был загружен с другими аргументами, для компиляции указанного имени Unicode-символа в положение в строке. До версии v5.16 необходимо было явно указывать use charnames для активации такого использования. (Однако до версии v5.16 форма "use charnames ();" не активировала \N{CHARNAME}.)
Обратите внимание, что \N{U+...}, где ... — шестнадцатеричное число, также вставляет символ в строку. Вставляемым символом является тот, чьё значение Unicode (порядковый номер) равно числу. Например, "\N{U+263a}" — это эквивалент смайлика Unicode (белый фон, чёрный шрифт) "\N{WHITE SMILING FACE}". Также обратите внимание, что \N{...} может обозначать квантификатор регулярного выражения вместо имени символа, когда ... — число (или пара чисел через запятую (см. "КВАНТИФИКАТОРЫ" в perlreref), и не связано с этим предикатом.
Предикат charnames поддерживает аргументы :full, :loose, :short, имена сценариев и настроенные псевдонимы.
Если :full присутствует, для расширения \N{CHARNAME}, строка CHARNAME сначала ищется в списке стандартных имён символов Unicode.
:loose является вариантом :full, который позволяет указать CHARNAME менее точно. Подробности см. в "СЛАБЫЕ СОПОСТАВЛЕНИЯ".
Если :short присутствует, и CHARNAME имеет вид SCRIPT:CNAME, то CNAME ищется как буква в сценарии SCRIPT, как описано в следующем абзаце. Или, если используется use charnames с аргументами имени сценария, то для \N{CHARNAME} имя CHARNAME ищется как буква в заданных сценариях (в указанном порядке). Настроенные псевдонимы могут переопределять эти значения, и их описание находится в "НАСТРОЕННЫХ ПСЕВДОНИМАХ".
Для поиска CHARNAME внутри заданного сценария SCRIPTNAME, этот предикат ищет в таблице стандартных имён Unicode имена
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 относится к символу Unicode U+1F514, а не к традиционному U+0007. Для последнего используйте ALERT или BEL.
Использование \N{NAME} с неизвестным NAME является синтаксической ошибкой.
Для \N{NAME}, это фатальная ошибка, если use bytes активен и входное имя соответствует символу, который не поместится в байт (то есть, чьё порядковое значение превышает 255).
В противном случае любая строка, содержащая \N{charname} или \N{U+code point}, автоматически будет использовать правила Unicode (см. "Байты и символы" в perlunicode).
СЛАБЫЕ СОПОСТАВЛЕНИЯ
Указав :loose, выбираются слабые правила сопоставления имён символов Unicode, а не строгое точное сопоставление, используемое в противном случае. Это означает, что CHARNAME не должен быть указан так точно. Регистр букв не имеет значения (кроме случаев со сценариями, упомянутыми выше), как и подчёркивания, и важны только тире в начале или конце слова в имени (с одним исключением: тире в U+1180 HANGUL JUNGSEONG O-E важно). Также пробелы, не примыкающие к тире, не важны. Официальные имена Unicode очень вариативны в использовании тире и пробелов для разделения похожих на слова единиц, и этот параметр позволяет вам не задумываться об этом. Причина, по которой не-средние тире важны, заключается в таких случаях, как U+0F60 TIBETAN LETTER -A против U+0F68 TIBETAN LETTER A. Тире здесь важно, как и пробел перед ним, поэтому оба должны быть включены.
:loose замедляет поиск в 2-3 раза по сравнению с :full, но выгода может быть того стоить. Каждый отдельный поиск занимает очень мало времени, и результаты кэшируются, поэтому разница в скорости будет фактором только в программах, которые выполняют поиск по множеству различных написаний, и, вероятно, только тогда, когда эти поиски выполняются через vianame() и string_vianame(), так как поиски \N{...} выполняются во время компиляции.
ПСЕВДОНИМЫ
Начиная с Unicode 6.1 и Perl v5.16, Unicode определяет множество сокращений и имён, которые раньше были расширениями Perl, а также некоторые дополнительные, которые раньше Perl не принимал. Список слишком велик для воспроизведения здесь, но полный список можно получить на веб-сайте Unicode: http://www.unicode.org/Public/UNIDATA/NameAliases.txt.
Более ранние версии Perl принимали почти все имена 6.1. Они были наиболее подробно описаны в версии v5.14 этой справки: http://perldoc.perl.org/5.14.0/charnames.html#ALIASES.
НАСТРОЕННЫЕ ПСЕВДОНИМЫ
Вы можете добавить настроенные псевдонимы к стандартным (:full) конвенциям именования Unicode. Псевдонимы переопределяют любые стандартные определения, поэтому, если вы достаточно увлечены, вы можете изменить "\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, можно использовать любые символы Unicode, отвечающие указанным выше критериям; до этого допускались только символы из диапазона Latin1.
Псевдоним может сопоставляться либо с официальным именем символа Unicode (не с именем, соответствующим слабому совпадению), либо с числовым кодом символа (порядковым номером). Последнее полезно для присвоения имён кодам символов в частных областях Unicode, таких как U+E800 до U+F8FF. Числовой код символа должен быть целым неотрицательным числом или строкой, начинающейся с "U+" или "0x", при этом остальная часть считается шестнадцатеричным целым числом. Литеральная числовая константа должна быть без знака; она будет интерпретироваться как шестнадцатеричная, если имеет ведущий ноль или содержит не десятичные шестнадцатеричные цифры; в противном случае она будет интерпретироваться как десятичная. Если она начинается с "U+", она интерпретируется как код символа Unicode; в противном случае — как код в системе. (Только коды символов ниже 256 могут отличаться между Unicode и системой.) Таким образом, 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(name)
Это оперативный эквивалент \N{...}. name может быть любым выражением, которое вычисляется в имя, принятое \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 для каждого управляющего символа (такого как ПЕРЕВОД СТРОКИ) является пустая строка. Однако почти все они имели имена, назначенные другими стандартами, такими как ASCII Стандарт, или они были в общем использовании. viacode возвращает эти имена как «лучшие» доступные. Unicode 6.1 создал Name_Aliases для каждого из них, включая альтернативные имена, такие как НОВАЯ СТРОКА. viacode использует исходное имя «ПЕРЕВОД СТРОКИ» вместо альтернативного. Аналогично, возвращаемое имя для U+FEFF — «ПРОБЕЛ НУЛЕВОЙ ШИРИНЫ НЕРАЗРЫВНЫЙ», а не «Метка порядка байтов».
До версии Unicode 6.1 у управляющих символов U+0080, U+0081, U+0084 и U+0099 не было ни имён, ни псевдонимов. Для обеспечения обратной совместимости любое определённое вами имя для этих кодовых номеров будет возвращаться этой функцией в приоритете над официальным именем.
Некоторые кодовые номера также имеют сокращенные имена, такие как «LF» или «NL». viacode никогда не возвращает их.
Поскольку исправление имени может быть добавлено в будущих выпусках Unicode, имя, которое возвращает viacode, может измениться в результате. Это редкое событие, но оно случается.
CUSTOM TRANSLATORS
Механизм преобразования \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–2023 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.38.0/charnames