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}, строка ИМЯ_СИМВОЛА сначала ищется в списке стандартных имён символов Юникода.
:loose — это вариант :full, который позволяет указать ИМЯ_СИМВОЛА менее точно. Подробности см. в "СВОБОДНЫЕ СООТВЕТСТВИЯ".
Если :short присутствует, и ИМЯ_СИМВОЛА имеет вид SCRIPT:CNAME, то ИМЯ_СИМВОЛА ищется как буква в скрипте Скрипт, как описано в следующем абзаце. Или, если use charnames используется с аргументами имени скрипта, то для \N{CHARNAME} имя ИМЯ_СИМВОЛА ищется как буква в заданных скриптах (в указанном порядке). Настроенные псевдонимы могут переопределять их, и они объясняются в "НАСТРОЙКИ ПСЕВДОНИМОВ".
Для поиска ИМЯ_СИМВОЛА внутри заданного скрипта ИМЯ_СКРИПТА, этот предикат ищет в таблице стандартных имён Юникода имена
SCRIPTNAME CAPITAL LETTER CHARNAME
SCRIPTNAME SMALL LETTER CHARNAME
SCRIPTNAME LETTER CHARNAME Если ИМЯ_СИМВОЛА состоит только из строчных букв, то вариант CAPITAL игнорируется, в противном случае вариант SMALL игнорируется, и оба ИМЯ_СИМВОЛА и ИМЯ_СКРИПТА преобразуются в верхний регистр для поиска. Помимо этого, оба они следуют свободным правилам, если также указан :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, выбираются правила свободного соответствия имени символа Юникода вместо строгого точного соответствия, используемого в противном случае. Это означает, что ИМЯ_СИМВОЛА не должно быть указано так точно. Регистр букв не имеет значения (за исключением скриптов, как указано выше), также как и нижнее подчёркивание, а единственные дефисы, которые имеют значение, — это те, что в начале или в конце слова в имени (за одним исключением: дефис в 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 не принимал. Список слишком длинный, чтобы его воспроизвести здесь, но вы можете получить полный список с веб-сайта Юникода: http://www.unicode.org/Public/UNIDATA/NameAliases.txt.
Более ранние версии Perl принимали почти все имена 6.1. Они были наиболее подробно описаны в версии под 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{...} во время выполнения. 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 пragma.
См. "ОШИБКИ" для случаев, в которых поведение отличается от описанного выше.
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_Alias для каждого из них, включая альтернативные имена, такие как NEW LINE. viacode использует исходное имя «LINE FEED» вместо альтернативного. Аналогичным образом, возвращаемое имя для U+FEFF — это "ПРОБЕЛ ШИРИНЫ НУЛЬ БЕЗ ПЕРЕНОСА", а не "MARK BYTE ORDER".
До 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–2020 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.30.3/charnames