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(name)" для выполнения поиска имени символа или именованной последовательности символов во время выполнения, возвращая строковое представление
-
"charnames::vianame(name)" для выполнения поиска имени символа (но не именованной последовательности символов) во время выполнения, чтобы получить его порядковое значение (код символа)
-
"charnames::viacode(code)" для выполнения поиска кода символа во время выполнения, чтобы получить его имя Юникода.
Начиная с 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 ранее не принимал. Список слишком длинный для воспроизведения здесь, но вы можете получить полный список с веб-сайта Юникода: 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(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 каждого управляющего символа (например, LINE FEED) — пустая строка. Однако почти все они имели имена, присвоенные другими стандартами, такими как стандарт ASCII, или были распространены в использовании. viacode возвращает эти имена как "лучшие" из доступных. Unicode 6.1 создал Name_Aliases для каждого из них, включая альтернативные имена, такие как NEW LINE. viacode использует исходное имя "LINE FEED" в предпочтение альтернативе. Аналогично, возвращаемое имя для U+FEFF — "ПРОБЕЛ НУЛЕВОЙ ШИРИНЫ БЕЗ РАЗРЫВА", а не "Метка порядка байтов".
До 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.32.0/charnames