Как узнать, какие кодовые точки Unicode определены в файле TTF?

11

Мне нужно автоматизировать процесс проверки того, какие символы Unicode имеют действительные глифы, определенные для них в файле шрифтов True Type. Как мне это делать? Кажется, я не могу найти информацию о том, как понять числа, которые я получаю, когда открываю файл .ttf в текстовом редакторе.

Sanuuu
источник

Ответы:

7

Я нашел библиотеку Python fonttools ( pypi ), которую можно использовать для небольшого количества сценариев Python.

Вот простой скрипт, который перечисляет все шрифты, которые указали глиф:

#!/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)

Первый аргумент - это кодовая точка (десятичная или шестнадцатеричная с 0x), а остальные - файлы шрифтов для поиска.

Я не стал пытаться заставить его работать для .ttcфайлов (где-то требуется дополнительный параметр).

Примечание. Сначала я попробовал инструмент otfinfo, но получил только базовые многоязычные символы плоскости (<= U + FFFF). Скрипт python находит символы расширенной плоскости в порядке.

Ян Худек
источник
6

Отфинфо выглядит многообещающе:

-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).

Например, DejaVuSans-Bold знает о лигатуре (fl):

$ otfinfo -u /usr/share/fonts/TTF/DejaVuSans-Bold.ttf |grep ^uniFB02
uniFB02 4899 fl
Михась
источник
Этот инструмент - именно то, что мне нужно, но он также не работает со шрифтами TrueType, только со шрифтами OpenType.
Санууу
Работает и с ттф тоже. Смотрите мой пример выше. (Согласно википедии ttf - это особый тип шрифта OpenType.)
michas
Хм ... моя версия otfinfo (2.92), похоже, вообще не имеет опции -u. Какую версию вы используете?
Санууу
Я использовал "otfinfo (LCDF typetools) 2.104" из моего пакета texlive .
Михас
@Sanuuu, -uопция не появляется в --help, но, кажется, все еще существует. Однако (по крайней мере, в сборке Debian 2.105) кажется, что он перечисляет только базовую плоскость (до U + FFFF). -gОпция знает о расширенных планах, но это не работает для всех шрифтов.
Ян Худек