Wie finde ich heraus, welche Unicode-Codepunkte in einer TTF-Datei definiert sind?

11

Ich muss einen Überprüfungsprozess automatisieren, für den Unicode-Zeichen tatsächliche Glyphen in einer True Type Font-Datei definiert sind. Wie mache ich das? Ich kann anscheinend keine Informationen darüber finden, wie ich die Zahlen, die ich beim Öffnen einer .ttf-Datei in einem Texteditor erhalte, verstehen kann.

Sanuuu
quelle

Antworten:

7

Ich habe eine Python-Bibliothek gefunden, fonttools ( pypi ), die verwendet werden kann, um es mit ein bisschen Python-Scripting zu tun.

Hier ist ein einfaches Skript, das alle Schriftarten auflistet, für die Glyphen angegeben wurden:

#!/usr/bin/env python3

from fontTools.ttLib import TTFont
import sys

char = int(sys.argv[1], base=0)

print("Looking for U+%X (%c)" % (char, chr(char)))

for arg in sys.argv[2:]:
    try:
        font = TTFont(arg)

        for cmap in font['cmap'].tables:
            if cmap.isUnicode():
                if char in cmap.cmap:
                    print("Found in", arg)
                    break
    except Exception as e:
        print("Failed to read", arg)
        print(e)

Das erste Argument ist Codepoint (Dezimal oder Hexa mit 0x) und der Rest sind Schriftdateien, in die gesucht werden muss.

Ich habe nicht versucht, es für .ttcDateien zum Laufen zu bringen (irgendwo sind zusätzliche Parameter erforderlich).

Hinweis: Ich habe zuerst das Tool otfinfo ausprobiert, aber nur grundlegende mehrsprachige Ebenenzeichen (<= U + FFFF) erhalten. Das Python-Skript findet erweiterte Ebenenzeichen in Ordnung.

Jan Hudec
quelle
6

otfinfo sieht vielversprechend aus:

-u, --unicode
  Print each Unicode code point supported by the font, followed by
  the glyph number representing that code point (and, if present,
  the name of the corresponding glyph).

Zum Beispiel kennt DejaVuSans-Bold die Fl-Ligatur (fl):

$ otfinfo -u /usr/share/fonts/TTF/DejaVuSans-Bold.ttf |grep ^uniFB02
uniFB02 4899 fl
michas
quelle
Dieses Tool ist genau das, was ich brauche, aber es scheint auch nicht mit TrueType-Schriftarten zu funktionieren, sondern nur mit OpenType-Schriftarten.
Sanuuu
Es funktioniert auch mit ttf. Siehe mein Beispiel oben. (Laut Wikipedia ist ttf eine spezielle Art von OpenType-Schriftart.)
michas
Hmm ... meine Version von otfinfo (2.92) scheint überhaupt nicht die Option -u zu haben. Welche Version verwenden Sie?
Sanuuu
Ich habe "otfinfo (LCDF typetools) 2.104" aus meinem texlive-Paket verwendet .
Michas
@ Sanuuu, die -uOption erscheint nicht in --help, scheint aber immer noch zu existieren. Allerdings (zumindest in Debian 2.105 Build) scheint es nur die Basisebene aufzulisten (bis zu U + FFFF). Die -gOption kennt die erweiterten Ebenen, funktioniert jedoch nicht für alle Schriftarten.
Jan Hudec