Erkennen Sie fehlende Glyphen im Text

10

Ich habe einen Python3-Appindikator geschrieben, der fortunedie Ausgabe aufruft und erfasst, um sie in der Bildschirmbenachrichtigung anzuzeigen.

Einige Vermögen enthalten Quadrate mit einer Hexadezimalzahl, wenn das entsprechende Symbol in der aktuellen Schriftart nicht vorhanden ist. Jedes Quadrat ist die Darstellung des hexadezimalen Unicode-Codepunkts für das fehlende Symbol.

Ich möchte den hexadezimalen Text entfernen, bevor ich ihn dem Benutzer anzeige. Ich hatte gehofft, eine Python-API zu finden, mit der ich Text Zeichen für Zeichen untersuchen kann, um etwas Ähnliches char.isValidCodePoint()oder Ähnliches festzustellen, aber ich kann es nicht als solches finden.

Ich fand eine mögliche Lösung , dass ich wollte , untersuchen , hier aber nach der Installation fonttoolsüber das Terminal, mein Python - Programm konnte nicht importiert werden fonttools/fontTools.

Irgendwelche Ideen - entweder über die Python-API oder über ein Terminal?

Update Nr. 1: Ich habe inzwischen festgestellt, dass der fonttoolsBeispielcode über den obigen Link für mich nicht funktioniert, da es sich um Python2 handelt. Ich nehme an, wenn ich fonttoolsirgendwie verwendet werden könnte, könnte ich einen Python2-Interpreter aus meinem Python3-Skript aufrufen.

Update Nr. 2: Nach vielem Lesen (siehe Referenzen unten) habe ich seitdem festgestellt, fc-matchaber es kann die verwendete Schriftart nicht immer eindeutig identifizieren. Ich erhalte die aktuelle Schriftart in Python:

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

was zu Ubuntu 11. Wenn pango-viewich dieses Ergebnis zusammen mit dem Hexadezimalzeichen weitergebe, erhalte ich eine Liste mit Schriftarten, einschließlich Ubuntu. Meiner Meinung nach sollte die Schrift nicht im Ergebnis von erscheinen, wenn das Symbol NICHT von der Schriftart gerendert wurde pango-view!

Verweise:

Bernmeister
quelle

Antworten:

0

Dies ist ein anderer Ansatz als der, mit dem Sie vorgegangen sind , aber vielleicht können Sie einfach Pythons str.replace()oder re.sub()Methoden verwenden, um die hexadezimalen Zeichenfolgen aus Ihrem Textkörper zu analysieren. dh:

Wenn das Hex vorhersehbar ist:

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

Oder wenn Sie Hex-Zeichen mit einem regulären Ausdruck abgleichen müssen:

import re

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

Weitere gute Diskussion dieser Strategie

Christopher Hunter
quelle
Es ist in Ordnung, alternative Optionen anzugeben, aber ich denke, Sie könnten Ihre Antwort erheblich verbessern, indem Sie 1) einen kurzen Beispielcode hinzufügen 2) mögliche PROs und CONs aus der ursprünglichen und Ihrer vorgeschlagenen Lösung beschreiben.
lpanebr
1
Ich versuche nicht, die ursprüngliche Lösung zu kritisieren, daher weiß ich nicht, ob ein PRO / CON-Vergleich hier hilfreich sein wird. Ich habe der Antwort jedoch Codebeispiele für meine Vorschläge hinzugefügt.
Christopher Hunter
@ChristopherHunter: Der Text, der aus dem Glück stammt, ist einfacher Text, und erst wenn dieser Text gerendert wird, erscheint das Hexadezimal (und das ist zu spät, um es zu erfassen und zu verarbeiten, wie Sie es vorschlagen).
Bernmeister
0

Unicode-Shaping-Engine

Verwenden Sie eine Unicode-Shaping-Engine wie Harfbuzz, um fehlende Glyphen zu erkennen. Hier ist ein Arbeitsbeispiel:

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

Ausgabe

registered
.notdef

Hier die Ausgabe in IDLE3 während der Überprüfung:

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

Überprüfen Sie den korrekten Schriftpfad. Ich habe gerade den ersten ausgewählt, den ich auf meinem aktuellen Computer gesehen habe.

Hinweis:

  • Ich bin mir ziemlich sicher, dass Gtk / Pango eine ähnliche Funktion haben. Pango hat bereits auf Harfbuzz auf niedrigem Niveau umgestellt. Ich habe jedoch keine Erfahrung mit einer solchen Bibliothek.
user.dz
quelle