Jak wydrukować nazwy glifów Unicode dla ciągu wejściowego?

12

Chciałbym móc biegać

unicode-names 'abç'

i zobacz odpowiednie nazwy znaków Unicode:

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

Drukowanie ciągu jako serii nazw glifów Unicode byłoby przydatne w kilku przypadkach:

  • Odróżnij łatwo mylące znaki, takie jak „i” i „í”.
  • Wyjaśnij, co tak naprawdę zawiera literał (na przykład niedrukowalne lub nieprzypisane znaki o zerowej szerokości).
l0b0
źródło

Odpowiedzi:

14

Uniutils pakiet zawiera program 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
z powodzeniem
źródło
1
Aby uzyskać minimalny wynik tylko z nazwami, użyj następujących opcji:echo -n …— | uniname -bcegpu
l0b0
8

Nie znam dobrego sposobu na sprawdzenie tego bash, ale Python ma wbudowaną bazę danych Unicode, której można używać jak w skrypcie takim jak ten:

#!/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)

Możesz użyć tego skryptu w następujący sposób (zakładając, że go nazwałeś 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

Baza danych zgłasza ValueErrorwyjątek dla dowolnych znaków, o których nie wie, więc wypisujemy ich punkty kodowe dziesiętnie (zwykle są to znaki niedrukowalne).

Uwaga: skrypt zakłada, że ​​twój terminal jest zakodowany w UTF-8. Jeśli nie jest, powinieneś zmienić argument decode()metody. Python obsługuje bardzo szeroki wybór kodowań, twoje na pewno tam będzie.

Alexios
źródło
1
Lepsze - użyj sys.getdefaultencoding().
Chris Down,