Comment imprimer les noms de glyphes Unicode pour la chaîne d'entrée?

12

J'aimerais pouvoir courir

unicode-names 'abç'

et voir les noms de caractères Unicode correspondants:

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

L'impression d'une chaîne sous la forme d'une série de noms de glyphes Unicode serait utile dans plusieurs cas:

  • Distinguez les caractères facilement confondus tels que "i" et "í".
  • Expliquez ce qu'une chaîne littérale contient réellement (par exemple, des caractères de largeur nulle non imprimables ou non attribués).
l0b0
la source

Réponses:

14

Le paquet uniutils a le programme 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
avec succès
la source
1
Pour une sortie minimale avec uniquement les noms, utilisez ces options:echo -n …— | uniname -bcegpu
l0b0
8

Je ne connais pas un bon moyen de vérifier cela bash, mais Python a une base de données Unicode intégrée que vous pouvez utiliser comme dans un script comme celui-ci:

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

Vous pouvez utiliser ce script comme ceci (en supposant que vous l'appeliez 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 données lève une ValueErrorexception pour tous les caractères qu'elle ne connaît pas, nous imprimons donc leurs points de code en décimal (ce sont généralement des caractères non imprimables).

Attention: le script suppose que votre terminal est encodé en UTF-8. Si ce n'est pas le cas, vous devez modifier l'argument de la decode()méthode. Python prend en charge une très large sélection d'encodages, le vôtre sera certainement là.

Alexios
la source
1
Mieux - utiliser sys.getdefaultencoding().
Chris Down