¿Cómo imprimir nombres de glifos Unicode para la cadena de entrada?

12

Me gustaría poder correr

unicode-names 'abç'

y vea los nombres de caracteres Unicode correspondientes:

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

Imprimir una cadena como una serie de nombres de glifos Unicode sería útil en varios casos:

  • Distinguir caracteres fácilmente confundidos como "i" e "í".
  • Explique qué contiene realmente una cadena literal (por ejemplo, caracteres no imprimibles o sin asignar, de ancho cero).
l0b0
fuente

Respuestas:

14

El paquete uniutils tiene el programa 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
donothings exitosamente
fuente
1
Para una salida mínima con solo los nombres, use estas opciones:echo -n …— | uniname -bcegpu
l0b0
8

No sé una buena manera de verificar esto bash, pero Python tiene una base de datos Unicode incorporada que puede usar como en un script como este:

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

Puede usar este script de esta manera (suponiendo que lo haya llamado 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

La base de datos arroja una ValueErrorexcepción para cualquier carácter que no conozca, por lo que imprimimos sus puntos de código en decimal (generalmente son caracteres no imprimibles).

Advertencia: el script asume que su terminal está codificada en UTF-8. Si no es así, debe cambiar el argumento del decode()método. Python admite una amplia selección de codificaciones, la suya definitivamente estará allí.

Alexios
fuente
1
Mejor uso sys.getdefaultencoding().
Chris Down