Как я могу найти общее имя для конкретного глифа?


21

Иногда я хотел бы знать имя глифа. Например, если я увижу , я, возможно, захочу узнать, является ли это дефисом -, дефисом , тире или символом минуса . Есть ли способ, которым я могу скопировать и вставить это в терминал, чтобы увидеть, что это такое?

Я не уверен, знает ли моя система общие имена для этих глифов, но определенно имеется некоторая (частичная) информация, например, в /usr/share/X11/locale/en_US.UTF-8/Compose. Например,

<Multi_key> <exclam> <question>         : "‽"   U203D # INTERROBANG

Другой пример глифов: 🐄.

Ответы:


30

Попробуйте утилиту Unicode :

$ unicode ‽
U+203D INTERROBANG
UTF-8: e2 80 bd  UTF-16BE: 203d  Decimal: &#8253;
‽
Category: Po (Punctuation, Other)
Bidi: ON (Other Neutrals)

Или uconvутилита из пакета ICU :

$ printf %s ‽ | uconv -x any-name
\N{INTERROBANG}

Вы также можете получить информацию через recodeутилиту:

$ printf %s ‽ | recode ..dump
UCS2   Mne   Description

203D         point exclarrogatif

Или с Perl:

$ printf %s ‽ | perl -CLS -Mcharnames=:full -lne 'print charnames::viacode(ord) for /./g'
INTERROBANG

Обратите внимание, что они дают информацию о символах, которые составляют этот глиф, а не о глифе в целом. Например, для (е с сочетанием острого акцента):

$ printf é | uconv -x any-name
\N{LATIN SMALL LETTER E}\N{COMBINING ACUTE ACCENT}

Отличается от автономного персонажа:

$ printf é | uconv -x any-name
\N{LATIN SMALL LETTER E WITH ACUTE}

Вы можете попросить uconvрекомбинировать те (для тех, которые имеют комбинированную форму):

$ printf 'e\u0301b\u0301' | uconv -x '::nfc;::name;'
\N{LATIN SMALL LETTER E WITH ACUTE}\N{LATIN SMALL LETTER B}\N{COMBINING ACUTE ACCENT}

(é имеет комбинированную форму, но не б́).


Что такое unicode? Похоже, я не установил это (и не могу найти его в репозиториях Arch Linux). Кроме того, что на земле exclarrogatif? [РЕДАКТИРОВАТЬ: я получаю это здесь, хотя моя система не французская.]
Sparhawk

2
@ Sparhawk, сокращение exclamatifи interrogatif. recodeбыл написан франко-канадским парнем в начале 80-х годов.
Стефан Шазелас

2
@Sparhawk kassiopeia.juls.savba.sk/~garabik/software/unicode - доступен в виде unicodeпакета в Debian, понятия не имею об упаковке в Arch.
Жиль "ТАК - перестань быть злым"

1
@ PaŭloEbermann Почему printf лучше, чем эхо? , Теперь, когда вы спросили, вы должны прочитать весь ответ. Там будет тест.
Terdon

1
@Sparhawk %sпохож на заполнитель, называемый спецификатором формата (или спецификатором преобразования). printf заменит его последующими аргументами, рассматривая его как строку (в отличие от числа, например) (обычно так, как вы ожидаете с помощью printf()функции C ). См. Документы ( pubs.opengroup.org/onlinepubs/9699919799//basedefs/… ).
Муру

5

Лучший способ, который я знаю, это через Perl uniprops. Он поставляется с Unicode::Tussleмодулем Perl . Вы можете установить его с

sudo perl -MCPAN -e 'install Unicode::Tussle'

Затем вы можете запустить его на любом глифе, который хотите протестировать:

$ uniprops  ‽
U+203D ‹‽› \N{INTERROBANG}
    \pP \p{Po}
    All Any Assigned InPunctuation Punct Is_Punctuation Common Zyyy Po P
       General_Punctuation Gr_Base Grapheme_Base Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn Print Punctuation STerm Term
       Terminal_Punctuation Unicode X_POSIX_Graph X_POSIX_Print X_POSIX_Punct

$ uniprops  🐄
U+1F404 ‹🐄› \N{COW}
    \pS \p{So}
    All Any Assigned InMiscPictographs Common Zyyy So S Gr_Base Grapheme_Base Graph
       GrBase Misc_Pictographs Miscellaneous_Symbols_And_Pictographs Other_Symbol
       Print Symbol Unicode X_POSIX_Graph X_POSIX_Print

unipropsтакже использует charnames :: viacode для внутреннего использования.
cuonglm

@cuonglm да, но модуль Tussle включает в себя всевозможные необычные инструменты и unipropsего гораздо проще набрать, чем явный вызов модуля. Он также предоставляет больше информации, чем просто имя.
Terdon

5

Вы можете использовать функцию Perl viacode из модуля charnames :

$ printf ‽ | perl -Mcharnames=:full -CLS -nle 'print charnames::viacode(ord)'
INTERROBANG
$ printf 🐄 | perl -Mcharnames=:full -CLS -nle 'print charnames::viacode(ord)'
COW

Charnames был впервые выпущен с Perl v5.6.0


Так как Perl 6 будет готов к производству в этот рождественский день, стоит упомянуть об этом здесь, так как, когда он имеет лучшую поддержку символов Unicode, которую я когда-либо видел. Вам нужно только позвонить uniname метод / рутина:

$ printf ‽ | perl6 -ne 'say .uniname'
INTERROBANG

(с сочетанием острого акцента) и автономный éхарактер дают вам:

# e with combining acute accent
$ printf é | perl6 -ne 'say .uniname'
LATIN SMALL LETTER E WITH ACUTE

# standalone é
$ printf é | perl6 -ne 'say .uniname'
LATIN SMALL LETTER E WITH ACUTE

( .uninameэто сокращение для $_.uniname)


4

Вы можете использовать unicode, что также выводит больше информации, чем просто имя:

# unicode –
U+2013 EN DASH
UTF-8: e2 80 93  UTF-16BE: 2013  Decimal: &#8211;
–
Category: Pd (Punctuation, Dash)
Bidi: ON (Other Neutrals)

Что такое unicode? Похоже, я не установил это (и не могу найти его в репозиториях Arch Linux).
Sparhawk

3
@Sparhawk на моем Debian, это просто скрипт Python, установленный unicodeпакетом. Вы сможете получить его, загрузив исходный пакет из репозиториев Debian .
Terdon

1

Создайте скрипт bash с этим:

#!/bin/bash
awk -F ":" '{print $2}' /usr/share/X11/locale/en_US.UTF-8/Compose | grep "$1" | awk -F "#" '{print $2}'

Например, назовите его так, как вы хотите, namecharи дайте ему разрешение на выполнение.

Теперь вы можете позвонить, например:

./namechar @

и результат будет:

COMMERCIAL AT

Это хорошо, но совпадает только с набором символов, а не с полным юникодом. Например, происходит сбой 🐄и выдает повторные результаты для . Последнее можно исправить, пропустив | sort -u.
Terdon

Да, @terdon - это правильно. (Вот почему я сказал «частичный» в вопросе.) Этот файл содержит только глифы, сопоставленные с Composeключом.
Sparhawk
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.