Rileva glifi mancanti nel testo


10

Ho scritto un appindicator di Python3 che chiama fortunee acquisisce l'output per la visualizzazione nella notifica sullo schermo.

Alcune fortune contengono quadrati con un numero esadecimale quando il glifo corrispondente non esiste nel carattere corrente. Ogni quadrato è la rappresentazione del punto di codice Unicode esadecimale per il glifo mancante.

Voglio rimuovere il testo esadecimale prima di visualizzarlo per l'utente. Speravo di trovare alcune API Python che mi permettessero di ispezionare il testo, carattere per carattere, per determinare qualcosa di simile char.isValidCodePoint()o simile, ma non riesco a trovare come tale.

Ho trovato una possibile soluzione che volevo studiare qui, ma dopo l'installazione fonttoolstramite il terminale, il mio programma Python non è riuscito a importare fonttools/fontTools.

Qualche idea: utilizzare l'API Python o chiamare un terminale?

Aggiornamento n. 1: da allora ho capito che il fonttoolscodice di esempio dal link sopra non funzionerà per me in quanto è Python2. Suppongo che se in fonttoolsqualche modo potesse essere usato, potrei invocare un interprete Python2 dal mio script Python3.

Aggiornamento n. 2: dopo molte letture (vedi riferimenti sotto), da allora ho trovato fc-matchma non è sempre possibile identificare in modo univoco il carattere in uso. Ottengo il carattere corrente in Python:

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

risultante in Ubuntu 11. Passando questo risultato pango-viewinsieme al carattere esadecimale, ottengo un elenco di caratteri incluso Ubuntu. Secondo me se il glifo NON è stato reso dal carattere, il carattere non dovrebbe apparire nel risultato di pango-view!

Riferimenti:

Risposte:


0

Questo è un approccio diverso da quello in cui stavi andando, ma forse potresti semplicemente usare i metodi str.replace()o i re.sub()metodi di Python per analizzare le stringhe esadecimali dal tuo corpo di testo. vale a dire:

Se l'esagono è prevedibile:

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

O se devi abbinare caratteri esadecimali a un'espressione regolare:

import re

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

Altre buone discussioni su questa strategia


Va bene fornire opzioni alternative, ma penso che potresti migliorare molto la tua risposta di 1) aggiungendo un breve codice di esempio 2) descrivendo possibili PRO e CONs dalla soluzione originale proposta e dalla tua.
lpanebr,

1
Non sto tentando di criticare la soluzione originale, quindi non so se un confronto PRO / CON sarà utile qui. Ho, tuttavia, aggiunto esempi di codice per i miei suggerimenti alla risposta.
Christopher Hunter,

@ChristopherHunter: Il testo che proviene dalla fortuna è un testo semplice ed è solo quando quel testo viene visualizzato che appare l'esadecimale (ed è troppo tardi per me catturare ed elaborare come suggerisci).
Bernmeister,

0

Motore di modellazione Unicode

Utilizzare un motore di modellazione Unicode come Harfbuzz per rilevare il glifo mancante. Ecco un esempio funzionante:

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'])

Produzione

registered
.notdef

Qui l'output in IDLE3 durante il controllo:

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

Verifica il percorso del font corretto, ho appena scelto il primo che ho visto nella mia macchina attuale.

Nota:

  • Sono tranquillo che Gtk / Pango abbiano una funzione simile, Pango è già passato a utilizzare Harfbuzz a basso livello. Tuttavia, non ho esperienza con tale lib.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.