Выяснение, какие символы поддерживает данный шрифт - PullRequest
50 голосов
/ 16 декабря 2010

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

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

Ответы [ 8 ]

36 голосов
/ 18 октября 2013

Вот метод с использованием модуля 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
26 голосов
/ 10 сентября 2014

Программа Linux xfd может сделать это. Он представлен в моем дистрибутиве как 'xorg-xfd'. Чтобы увидеть все символы шрифта, вы можете запустить его в терминале:

xfd -fa "DejaVu Sans Mono"
12 голосов
/ 18 октября 2013

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

Поскольку практически все современные приложения linux основаны на fontconfig, это гораздо полезнее, чем простой список юникодов

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

8 голосов
/ 13 июля 2011

Кодовые точки символов для шрифта ttf / otf хранятся в таблице CMAP.

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

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

4 голосов
/ 21 сентября 2018

Команды 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' для проверки соответствия правильного шрифта.

4 голосов
/ 04 ноября 2012

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

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

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

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

0 голосов
/ 16 сентября 2018

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

#!/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) за ответ выше.

0 голосов
/ 18 декабря 2010

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

...