Détecter les glyphes manquants dans le texte

J’ai écrit un indicateur Python3 qui appelle fortune et capture la sortie pour affichage 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 sharepoint code Unicode hexadécimal du glyphe manquant.

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

J’ai trouvé une solution que je voulais explorer ici, mais après l’installation de fonttools via le terminal, mon programme Python n’a pas pu importer fonttools/fontTools .

Des idées – en utilisant l’API Python ou en appelant un terminal?

Mise à jour n ° 1: J’ai depuis réalisé que l’exemple de code fonttools du lien ci-dessus ne fonctionnerait pas car il s’agit de Python2. Je suppose que si fonttools pouvait être utilisé, je pourrais appeler un interpréteur Python2 à partir de mon script Python3.

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

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

résultant dans Ubuntu 11 . En passant ce résultat à pango-view avec le caractère hexadécimal, je reçois une liste de fonts incluant Ubuntu . À mon avis, si le glyphe n’était PAS rendu par la police, la police ne devrait pas apparaître dans le résultat de pango-view !

Les références:

  • Comment savoir comment correspond fc-match?
  • Découvrez la police de secours utilisée par fontconfig pour un certain caractère
  • J’ai regardé fixement le fontconfig, et le fontconfig m’a regardé fixement

C’est une approche différente de celle que vous aviez, mais vous pourriez peut-être simplement utiliser les str.replace() ou re.sub() python pour parsingr les chaînes hexadécimales de votre corps de texte. c’est à dire:

Si l’hex est prévisible:

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

Ou si vous devez faire correspondre des caractères hexadécimaux avec une expression régulière:

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

Plus de bonnes discussions sur cette stratégie