Как напечатать имена глифов Unicode для входной строки?

Как напечатать имена глифов Unicode для входной строки?

Я хотел бы уметь бегать

unicode-names 'abç'

и посмотрите соответствующие названия символов Unicode:

LATIN SMALL LETTER A
LATIN SMALL LETTER B
LATIN SMALL LETTER C WITH CEDILLA

Печать строки в виде серии имен глифов Unicode может быть полезна в нескольких случаях:

  • Различайте легко путаемые символы, такие как «i» и «í».
  • Объясните, что на самом деле содержит литеральная строка (например, непечатаемые или неназначенные символы нулевой ширины).

решение1

TheuniutilsВ пакете есть программа uniname:

$ printf %s '…—' |uniname
character  byte       UTF-32   encoded as     glyph   name
    0          0  002026   E2 80 A6       …      HORIZONTAL ELLIPSIS
    1          3  002014   E2 80 94       —      EM DASH

решение2

Я не знаю хорошего способа проверить это bash, но в Python есть встроенная база данных Unicode, которую можно использовать в таком скрипте:

#!/usr/bin/env python
import sys, unicodedata
for ch in sys.stdin.read().decode('utf-8'):
  try:
    print unicodedata.name(ch)
  except ValueError:
    print 'codepoint ', ord(ch)

Вы можете использовать этот скрипт следующим образом (предполагая, что вы его назвали unicode-names):

$ echo 'abc©áοπρσ' | unicode-names
LATIN SMALL LETTER A
LATIN SMALL LETTER B
LATIN SMALL LETTER C
COPYRIGHT SIGN
LATIN SMALL LETTER A WITH ACUTE
GREEK SMALL LETTER OMICRON
GREEK SMALL LETTER PI
GREEK SMALL LETTER RHO
GREEK SMALL LETTER SIGMA
codepoint 10

База данных выдает ValueErrorисключение для любых неизвестных ей символов, поэтому мы выводим их кодовые точки в десятичном виде (обычно это непечатаемые символы).

Предостережение: скрипт предполагает, что ваш терминал имеет кодировку UTF-8. Если это не так, вам следует изменить аргумент метода decode(). Python поддерживает очень широкий выбор кодировок, ваша определенно будет там.

решение3

Однажды я написал uдля этого такой скрипт:

#! /bin/sh -
exec perl -Mcharnames=full -Mopen=locale -lne '
  printf "U+%04X %s\n", ord($_), charnames::viacode(ord($_)) for /./g' -- "$@"

Используется в качестве:

$ u <<< '棽'
U+0119 LATIN SMALL LETTER E WITH OGONEK
U+00A3 POUND SIGN
U+00BD VULGAR FRACTION ONE HALF

У меня также есть эта openbox(моего оконного менеджера) привязка клавиш:

  <keybind key="W-J">
    <action name="Execute">
      <command>sh -c "notify-send -- \"$(xclip -o | perl -Mcharnames=:full -C -lne 'printf \"U+%04X %s\n\", $_, charnames::viacode($_) for map ord, /\P{ascii}/g')\""</command>
    </action>
  </keybind>

При нажатии Windows+ Jотправляется уведомление с описанием не-ASCII символов в основном выборе X11, что может оказаться полезным.

Связанный контент