Wie finde ich die passende Schriftart zum Rendern von Unicode-Codepunkten?
gnome-terminal
Stellen Sie fest, dass Zeichen wie "🉃 ⼼ 😻🕲🝤" mit Schriftarten wie "Symbola" und nicht mit meiner Terminalschriftart oder dem Codepoint-in-Square-Fallback (????) gerendert werden können. Wie ?
Antworten:
Dies ist nicht unbedingt die beste Methode, und es ist sicher nicht benutzerfreundlich, aber es ist einfach, daran zu arbeiten: Hier ist ein Python-Skript, um dies zu tun.
Installieren Sie die Python-fontconfig- Bibliothek. Beziehen Sie es entweder von Ihrer Distribution (z. B.
sudo apt-get install python-fontconfig
unter Debian und Derivaten) oder installieren Sie es in Ihrem Home-Verzeichnis (pip install --user python-fontconfig)
. Dann können Sie dieses Skript ausführen (speichern Sie esfc-search-codepoint
in einem Verzeichnis auf IhremPATH
, z. B. typical~/bin
, und machen Sie es ausführbar):Anwendungsbeispiel:
Ich habe keine Schrift mit all diesen Zeichen.
quelle
#!/usr/bin/env python
zu#!/usr/bin/env python2
laut PEP 394.python3
zu arbeiten; Ich habe gerade eine kleinere Version davon am Ende dieser Antwort geschrieben .Fontconfig verwenden,
z.B
zeigt alle Schriftdateinamen an, die ✓ und ✗ enthalten.
Um den Codepunkt zu erhalten, der dem Zeichen entspricht, verwenden Sie (zum Beispiel)
Dies verwendet eine etwas undurchsichtige Funktion des POSIX-
printf
Dienstprogramms :Zusammen genommen,
Dies verwendet das
xargs
-I
Flag, um{}
durch Namen von zu ersetzenstdin
. Das läuft also effektiv auf Folgendes hinaus:quelle
fontconfig
dieser Version2.11.91
oder höher benötigen .printf
und/bin/printf
nicht unterstützenfc-list --format='%{postscriptname}\n' ':charset=2500-257F'
Letztendlich benutzt gnome-terminal fontconfig um (unter anderem):
In der API-Dokumentation finden Sie Funktionen zum Abfragen von Schriftzeichenbereichen und für Vorgänge in Zeichenbereichen. Die Dokumentation ist jedoch so kryptisch, dass ich nie herausfinden konnte, wie verschiedene Funktionssätze miteinander zusammenhängen. Wenn ich tiefer eintauchen müsste, würde ich mir lieber Beispiele für die Verwendung in anderer Software ansehen, vielleicht vte (die Terminalemulationsbibliothek, die in gnome-terminal verwendet wird).
Eine weitere Bibliothek zwischen vte und fontconfig ist pango "... eine Bibliothek zum Layouten und Rendern von Text mit Schwerpunkt auf Internationalisierung ..." . Nun, da ich darüber nachdenke, klingt es so, als würde es den größten Teil der Logik enthalten, nach der Sie suchen.
Die Zeichenabdeckungsfunktion in Pango wird durch Abdeckungskarten implementiert ( "In Pango muss häufig festgestellt werden, ob eine bestimmte Schriftart ein bestimmtes Zeichen darstellen kann und wie gut sie dieses Zeichen darstellen kann. PangoCoverage ist eine verwendete Datenstruktur um diese Informationen darzustellen. " ), aber es gibt wahrscheinlich kompliziertere Details bei der Entscheidung, welche Glyphe mit welcher Schriftart dargestellt werden soll. Ich denke , VTE auf verläßt sich pango Strings mit entsprechenden Schriftart zu machen , während pango Anwendungen fontconfig (oder anderer Backend unterstützt Schriftart) die am besten geeignete Schriftart auf verschiedene pieced der Logik in Basis zu finden pango selbst und / oder das Backend.
quelle
Ich habe den Code geändert, um zu überprüfen, ob eine Schriftart alle Zeichen einer bestimmten Zeichenfolge enthält. Dies kann also von aufgerufen werden
fc-search-codepoint "$fontname" "$string"
und gibt bei Erfolg den Exit-Code 0 oder andernfalls 1 zurück. Die Schriftnamen können vonfc-query /path/to/FontSandMonoBoldOblique.ttf
oder Imagemagick's abgerufen werdenconvert -list font
. Ich verwende es, um zu überprüfen, ob eine vom Benutzer ausgewählte Zeichenfolge mit der vom Benutzer ausgewählten Schriftart gerendert werden kann, und wenn der Befehl fehlschlägt, wird eine Ersatzschrift verwendet.quelle