2010-12-16 16 views
39

Wie extrahiere ich die Liste der unterstützten Unicode-Zeichen aus einer TrueType oder eingebetteten OpenType-Schriftart unter Linux?Herausfinden, welche Zeichen eine Schriftart unterstützt

Gibt es ein Werkzeug oder eine Bibliothek, die ich verwenden kann, um eine .ttf oder eine .eot-Datei zu verarbeiten und eine Liste von Codepunkten (wie U + 0123, U + 1234, usw.) zu erstellen?

Antwort

29

hier ein Verfahren ist, den FontTools-Modul (die Sie mit etwas installieren können wie pip install fonttools):

#!/usr/bin/env python 
from itertools import chain 
import sys 

from fontTools.ttLib import TTFont 
from fontTools.unicode import Unicode 

ttf = TTFont(sys.argv[1], 0, verbose=0, allowVID=0, 
       ignoreDecompileErrors=True, 
       fontNumber=-1) 

chars = chain.from_iterable([y + (Unicode[y[0]],) for y in x.cmap.items()] for x in ttf["cmap"].tables) 
print(list(chars)) 

# Use this for just checking if the font contains the codepoint given as 
# second argument: 
#char = int(sys.argv[2], 0) 
#print(Unicode[char]) 
#print(char in (x[0] for x in chars)) 

ttf.close() 

Das Skript als Argument Pfad der Schriftart nimmt:

python checkfont.py /path/to/font.ttf 
+0

'int (sys.argv [2], 0)' wird wahrscheinlich mit "ungültigem Literal" in den meisten Fällen fehlschlagen, da man wahrscheinlich Sonderzeichen finden möchte. Verwenden Sie statt dessen ord (sys.argv [2] .decode ('string_escape'). Decode ('utf-8')) '. –

+1

Wie auch immer, dieses Skript basierend auf 'Python-Fontconfig' scheint viel schneller: http://unix.stackexchange.com/a/268286/26952 –

+0

@SkippyleGrandGourou Dieser Satz scheint richtig? Er übergibt 'sys.argv [1]' an 'TTFont()'? – Carpetsmoker

6

Die Zeichencodepunkte für eine Schriftart ttf/otf werden in der CMAP-Tabelle gespeichert.

Mit TTX können Sie eine XML-Darstellung der CMAP-Tabelle generieren. siehe http://www.letterror.com/code/ttx/index.html

Sobald TTX läuft, können Sie den Befehl "ttx.exe -tcmap MyFont.ttf" ausführen und es sollte eine Datei "MyFont.ttx" ausgeben. Öffnen Sie es in einem Texteditor und es sollte Ihnen den gesamten Zeichencode anzeigen, den es in der Schriftart gefunden hat.

+0

Danke, das ist hilfreich. –

3

Ich hatte gerade das gleiche Problem, und machte eine HOWTO, die einen Schritt weiter geht, einen Regexp aller unterstützten Unicode-Codepunkte backen.

Wenn Sie nur die Reihe von Codepoints möchten, können Sie diese verwenden, wenn an Ihrem ttx xml in Chrome devtools späht nach ttx -t cmap myfont.ttf läuft und wahrscheinlich myfont.ttx-myfont.xml Umbenennung Chrome xml-Modus aufzurufen:

function codepoint(node) { return Number(node.nodeValue); } 
$x('//cmap/*[@platformID="0"]/*/@code').map(codepoint); 

(beruft sich auch auf fonttools von gilamesh Vorschlag; sudo apt-get install fonttools, wenn Sie auf einem ubuntu-System sind.)

9

fc-query my-font.ttf finden Sie eine Karte der unterstützten Glyphen geben und allen Gegenden der Schrift ist für

fontconfig nach

Da so ziemlich alle modernen Linux-Anwendungen fontconfigbasiert sind, ist dies viel nützlicher als eine unformatierte Unicode-Liste

Das Format aktuelle Ausgabe wird hier diskutiert http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html

18

Das Linux-Programm xfd dies tun können. Es ist in meiner Distribution als 'xorg-xfd' zur Verfügung gestellt. Um alle Zeichen für eine Schriftart zu sehen, können Sie dies in Terminal ausführen:

xfd -fa "DejaVu Sans Mono" 
+0

xfd gibt auch die hex Werte, wie Sie sie für Unicode schreiben müssen ala ctrl + shift + u – euxneks

+12

Das Öffnen einer GUI Character Map ist nicht das Gleiche wie das Auflisten der unterstützten Zeichen. – rspeer

Verwandte Themen