Como imprimir nomes de glifos Unicode para a string de entrada?

12

Eu gostaria de poder correr

unicode-names 'abç'

e veja os nomes de caracteres Unicode correspondentes:

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

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

  • Distinga caracteres facilmente confusos, como "i" e "í".
  • Explique o que realmente contém uma sequência literal (por exemplo, caracteres de largura zero não imprimíveis ou não atribuídos).
l0b0
fonte

Respostas:

14

O pacote uniutils possui o 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
donutingsuccessfully
fonte
1
Para saída mínima apenas com os nomes, use estas opções:echo -n …— | uniname -bcegpu
l0b0
8

Não conheço uma boa maneira de verificar isso bash, mas o Python possui um banco de dados Unicode interno que você pode usar como 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 como este (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 gera uma ValueErrorexceção para qualquer caractere que não conheça, portanto, imprimimos seus pontos de código em decimal (geralmente são caracteres imprimíveis).

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

Alexios
fonte
1
Melhor - use sys.getdefaultencoding().
Chris Baixo