Як друкувати назви гліфів Unicode для вхідного рядка?


12

Мені б хотілося бігати

unicode-names 'abç'

і побачити відповідні імена символів Unicode:

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

Друк рядка як серії імен гліфів Unicode було б корисним у кількох випадках:

  • Розрізняють легко плутати символи, такі як "i" та "í".
  • Поясніть, що насправді містить буквальний рядок (наприклад, недруковані або непризначені символи нульової ширини).

Відповіді:


14

У пакеті uniutils є програма uniname.

$ echo -n …—|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

1
Для мінімального виведення лише імен використовуйте наступні параметри:echo -n …— | uniname -bcegpu
l0b0

8

Я не знаю хорошого способу перевірити це 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виняток для будь-яких символів, про які вона не знає, тому друкуємо їх кодові точки у десятковій формі (зазвичай це недруковані символи).

Caveat: сценарій передбачає, що ваш термінал закодований UTF-8. Якщо це не так, слід змінити аргумент decode()методу. Python підтримує дуже широкий вибір кодувань, ваше точно буде там.


1
Краще - використовувати sys.getdefaultencoding().
Кріс Даун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.