Como imprimir nomes de glifos Unicode para string de entrada?

Como imprimir nomes de glifos Unicode para string de entrada?

Eu gostaria de poder correr

unicode-names 'abç'

e veja os nomes dos caracteres Unicode correspondentes:

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

Imprimir uma string como uma série de nomes de glifos Unicode seria útil em vários casos:

  • Distinguir caracteres facilmente confundidos como "i" e "í".
  • Explique o que uma string literal realmente contém (por exemplo, caracteres não imprimíveis ou não atribuídos, de largura zero).

Responder1

Ouniutilspacote tem o 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

Responder2

Não conheço uma boa maneira de verificar isso bash, mas o Python possui um banco de dados Unicode integrado que você pode usar em um 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)

Você pode usar este script assim (assumindo que você o chamou 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

O banco de dados lança uma ValueErrorexceção para quaisquer caracteres que não conhece, então imprimimos seus pontos de código em decimal (geralmente são caracteres não imprimíveis).

Advertência: o script assume que seu terminal é codificado em UTF-8. Caso contrário, você deve alterar o argumento do decode()método. Python suporta uma ampla seleção de codificações, a sua definitivamente estará lá.

Responder3

Certa vez, escrevi este uscript para isso:

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

Eu também tenho esta openboxligação de tecla (meu gerenciador de janelas):

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

Que ao pressionar Windows+ Jenvia uma notificação descrevendo os caracteres não ASCII na seleção primária do X11, que pode ser útil.

informação relacionada