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

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

me gustaria 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 que se confunden fácilmente como "i" e "í".
  • Explique qué contiene realmente una cadena literal (por ejemplo, caracteres de ancho cero no imprimibles o no asignados).

Respuesta1

EluniutilsEl paquete tiene el programa 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

Respuesta2

No conozco una buena manera de verificar esto bash, pero Python tiene una base de datos Unicode incorporada que puedes 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 utilizar 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 genera una ValueErrorexcepción para cualquier carácter que no conoce, por lo que imprimimos sus puntos de código en decimal (normalmente son caracteres no imprimibles).

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

Respuesta3

Una vez escribí este uguión para eso:

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

Usado como:

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

También tengo esta openboxcombinación de teclas (mi administrador de ventanas):

  <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>

Lo cual, al presionar Windows+, Jenvía una notificación que describe los caracteres que no son ASCII en la selección principal de X11, lo que puede resultarle útil.

información relacionada