10 votes

Détecter les glyphes manquants dans un texte

J'ai écrit un appindicateur Python3 qui appelle fortune et capture la sortie pour l'afficher dans la notification à l'écran.

Certaines fortunes contiennent des carrés avec un nombre hexadécimal lorsque le glyphe correspondant n'existe pas dans la police actuelle. Chaque carré est la représentation du point de code hexadécimal Unicode pour le glyphe manquant.

Je veux supprimer le texte hexadécimal avant de l'afficher à l'utilisateur. J'espérais trouver une API Python qui me permettrait d'inspecter le texte, caractère par caractère, pour déterminer quelque chose comme char.isValidCodePoint() ou similaire mais je ne peux pas le trouver en tant que tel.

J'ai trouvé une solution possible que je voulais étudier. aquí mais après avoir installé fonttools via le terminal, mon programme Python ne pouvait pas importer fonttools/fontTools .

Des idées - en utilisant l'API Python ou en appelant un terminal ?

Mise à jour #1 : J'ai depuis réalisé que le fonttools L'exemple de code du lien ci-dessus ne fonctionne pas pour moi, car il s'agit de Python2. fonttools pourrait être utilisé d'une manière ou d'une autre, je pourrais invoquer un interprète Python2 à partir de mon script Python3.

Mise à jour 2 : Après de nombreuses lectures (voir les références ci-dessous), j'ai depuis trouvé fc-match mais il ne peut pas toujours de manière unique identifier la police utilisée. J'obtiens la police actuelle en Python :

from gi.repository import Gio
fontName = Gio.Settings( "org.gnome.desktop.interface" ).get_string( "font-name" )

ce qui entraîne Ubuntu 11 . En passant ce résultat à pango-view avec le caractère hexadécimal, j'obtiens une liste de polices comprenant Ubuntu . À mon avis, si le glyphe n'a PAS été rendu par la police, celle-ci ne devrait pas apparaître dans le résultat de l'opération. pango-view !

Références :

0voto

joe Points 41

Il s'agit d'une approche différente de celle que vous souhaitiez adopter, mais vous pourriez peut-être utiliser l'outil Python str.replace() o re.sub() pour extraire les chaînes hexadécimales de votre corps de texte :

Si l'hexagone est prévisible :

originalText = "\xc3\xa5Test"
filteredText = originalText.replace("\xc3\xa5", "")

Ou si vous avez besoin de faire correspondre n'importe quels caractères hexagonaux avec une expression régulière :

import re

originalText = "\xc3\xa5Test"
filteredText = re.sub(r'[^\x00-\x7f]', r'', originalText)

Une autre bonne discussion sur cette stratégie

0voto

user.dz Points 45060

Moteur de mise en forme Unicode

Utilisez un moteur de mise en forme Unicode comme Harfbuzz pour détecter les glyphes manquants. Voici un exemple fonctionnel :

from pyharfbuzz import shape
f = "/usr/local/lib/python3.6/site-packages/werkzeug/debug/shared/ubuntu.ttf"
t = "®"
s = shape(f, t)
print(s[1]['glyph_name'])
t = ""
s = shape(f, t)
print(s[1]['glyph_name'])

Sortie

registered
.notdef

Voici la sortie dans IDLE3 pendant la vérification :

>>> t = "®"
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': 'registered', 'x_advance': 29.453125, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]
>>> t = ""
>>> s = shape(f, t)
>>> s
[{'cluster': 0, 'glyph_name': '.notdef', 'x_advance': 36.0, 'y_advance': 0.0, 'x_offset': 0.0, 'y_offset': 0.0}]

Vérifiez le chemin correct de la police, j'ai juste choisi la première que j'ai vue dans ma machine actuelle.

Note :

  • Je suis sûr que Gtk/Pango ont une fonction similaire, Pango a déjà changé pour utiliser Harfbuzz à bas niveau. Cependant, je n'ai pas d'expérience dans l'utilisation de ces librairies.

0voto

Bernmeister Points 1231

J'ai trouvé une solution... Au départ, je pensais que les fichiers texte de fortune ne contenaient PAS les caractères hexadécimaux. Il s'avère que c'était faux. Une fois que j'ai réalisé cela, j'ai trouvé la solution ci-dessous :

import codecs
fortune = <call the fortune program>
output = ""
for c in fortune:
    if codecs.encode( str.encode( c ), "hex" ) == b'07':
        continue

    output += c                   

print( output )

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X