Выяснить, какие персонажи поддерживает данный шрифт

StackOverflow https://stackoverflow.com/questions/4458696

Вопрос

Как извлечь список поддерживаемых символов Unicode из TrueType или встроенного шрифта Opentype на Linux?

Есть ли инструмент или библиотека, которую я могу использовать для обработки файла .ttf или .eot и создать список кодовых точек (например, U+0123, U+1234 и т. Д.), Предоставленные шрифтом?

Это было полезно?

Решение

Вот метод с использованием Fonttools модуль (который вы можете установить с чем -то вроде 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()

Сценарий принимает в качестве аргумента путь шрифта:

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

Другие советы

Программа Linux XFD может сделать это. Это предоставлено в моем дистрибутиве как «Xorg-Xfd». Чтобы увидеть всех символов для шрифта, вы можете запустить это в терминале:

xfd -fa "DejaVu Sans Mono"

fc-query my-font.ttf даст вам карту поддерживаемых глифов и все локали, которые шрифт подходит для Согласно FontConfig

Поскольку почти все современные приложения Linux основаны на основе FontConfig, это гораздо полезно, чем необработанный список Unicode

Фактический формат вывода обсуждается здесьhttp://lists.freedesktop.org/archives/fontconfig/2013-september/004915.html

Код символа для шрифта TTF/OTF хранятся в CMAP стол.

Вы можете использовать ttx Чтобы генерировать XML -представление CMAP стол. видеть здесь.

Вы можете запустить команду ttx.exe -t cmap MyFont.ttf и он должен вывести файл MyFont.ttx. Анкет Откройте его в текстовом редакторе, и он должен показать вам весь код символа, который он нашел в шрифте.

А fontconfig Команды могут вывести список глиф в качестве компактного списка диапазонов, например:

$ fc-match --format='%{charset}\n' OpenSans
20-7e a0-17f 192 1a0-1a1 1af-1b0 1f0 1fa-1ff 218-21b 237 2bc 2c6-2c7 2c9
2d8-2dd 2f3 300-301 303 309 30f 323 384-38a 38c 38e-3a1 3a3-3ce 3d1-3d2 3d6
400-486 488-513 1e00-1e01 1e3e-1e3f 1e80-1e85 1ea0-1ef9 1f4d 2000-200b
2013-2015 2017-201e 2020-2022 2026 2030 2032-2033 2039-203a 203c 2044 2070
2074-2079 207f 20a3-20a4 20a7 20ab-20ac 2105 2113 2116 2120 2122 2126 212e
215b-215e 2202 2206 220f 2211-2212 221a 221e 222b 2248 2260 2264-2265 25ca
fb00-fb04 feff fffc-fffd

Использовать fc-query для .ttf Файл и fc-match Для установленного имени шрифта.

Это, вероятно, не включает в себя установку дополнительных пакетов и не включает в себя перевод растрового изображения.

Использовать fc-match --format='%{file}\n' Чтобы проверить, соответствует ли правильный шрифт.

У меня только что была та же проблема, и я сделал КАК Это идет еще на шаг вперед, выпекая регулярность всех поддерживаемых точек кода Unicode.

Если вы просто хотите массив кодепоинтов, вы можете использовать это, когда заглядываете на свой ttx XML в Chrome Devtools, после бега ttx -t cmap myfont.ttf и, вероятно, переименование myfont.ttx к myfont.xml Чтобы вызвать режим XML Chrome:

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

(Также полагается на fonttools из предложения Гиламеша; sudo apt-get install fonttools Если вы в системе Ubuntu.)

Если вы хотите только «просматривать» шрифты, может быть полезно следующее (если ваш терминал поддерживает рассматриваемый шрифт):

#!/usr/bin/env python
import sys
from fontTools.ttLib import TTFont

with TTFont(sys.argv[1], 0, ignoreDecompileErrors=True) as ttf:
    for x in ttf["cmap"].tables:
        for (_, code) in x.cmap.items():
            point = code.replace('uni', '\\u').lower()
            print("echo -e '" + point + "'")

Небезопасный, но простой способ просмотреть:

python font.py my-font.ttf | sh

Спасибо Янусу (https://stackoverflow.com/a/19438403/431528) для ответа выше.

Вышеупомянутый ответ Януса (https://stackoverflow.com/a/19438403/431528) работает. Но Python слишком медленный, особенно для азиатских шрифтов. Это стоит минуты для шрифта размера 40 МБ на моем компьютере E5.

Поэтому я пишу небольшую программу C ++, чтобы сделать это. Это зависит от Freetype2 (https://www.freetype.org/) Это проект VS2015, но его легко переносить в Linux, потому что это приложение для консоли.

Код можно найти здесь, https://github.com/zhk/allcodepointsДля азиатского шрифта размером 40 МБ он стоит около 30 мс на моем компьютере E5.

Если вы хотите получить всех символов, поддерживаемых шрифтом, вы можете использовать следующее (на основе ответа Януса)

from fontTools.ttLib import TTFont

def get_font_characters(font_path):
    with TTFont(font_path) as font:
        characters = {chr(y[0]) for x in font["cmap"].tables for y in x.cmap.items()}
    return characters

Вы можете сделать это на Linux в Perl, используя Font :: ttf модуль.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top