Выяснение, какие символы поддерживает данный шрифт
Как извлечь список поддерживаемых символов Unicode из TrueType или встроенного шрифта OpenType в Linux?
Есть ли инструмент или библиотека, которые я могу использовать для обработки файла .ttf или .eot и построения списка кодовых точек (например, U + 0123, U + 1234 и т.д.), предоставляемых шрифтом?
Ответы
Ответ 1
Вот метод, использующий модуль 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
Ответ 2
Программа Linux xfd может сделать это. Он был представлен в моем дистрибутиве как "xorg-xfd". Чтобы увидеть все символы шрифта, вы можете запустить это в терминале:
xfd -fa "DejaVu Sans Mono"
Ответ 3
fc-query my-font.ttf
предоставит вам карту поддерживаемых глифов и все локали, для которых подходит шрифт в соответствии с fontconfig
Поскольку практически все современные приложения Linux основаны на fontconfig, это гораздо полезнее, чем простой список юникодов
Фактический формат вывода обсуждается здесь http://lists.freedesktop.org/archives/fontconfig/2013-September/004915.html
Ответ 4
Кодовые точки символов для шрифта ttf/otf хранятся в таблице CMAP
.
Вы можете использовать ttx
для генерации XML-представления таблицы CMAP
. смотрите здесь.
Вы можете запустить команду ttx.exe -t cmap MyFont.ttf
и она должна вывести файл MyFont.ttx
. Откройте его в текстовом редакторе, и он должен показать вам весь код символа, который он нашел в шрифте.
Ответ 5
Команды 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'
чтобы проверить, соответствует ли правильный шрифт.
Ответ 6
У меня была такая же проблема, и я сделал 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
из предложения gilamesh; sudo apt-get install fonttools
, если вы находитесь в системе ubuntu.)
Ответ 7
Если вы ТОЛЬКО хотите "просмотреть" шрифты, может быть полезно следующее (если ваш терминал поддерживает данный шрифт):
#!/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
Спасибо Янусу (fooobar.com/questions/145953/...) за ответ выше.
Ответ 8
Приведенный выше ответ януса (fooobar.com/questions/145953/...) работает. Но python слишком медленный, особенно для азиатских шрифтов. Стоимость шрифта размером 40 МБ на моем компьютере E5 составляет несколько минут.
Поэтому я пишу небольшую C++ программу для этого. Это зависит от FreeType2 (https://www.freetype.org/). Это проект vs2015, но его легко портировать на linux, поскольку это консольное приложение.
Код можно найти здесь, https://github.com/zhk/AllCodePoints
Для азиатского шрифта размером 40 МБ на моем компьютере E5 стоит около 30 мс.
Ответ 9
Если вы хотите получить все символы, поддерживаемые шрифтом, вы можете использовать следующее (на основе ответа Janus)
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
Ответ 10
Вы можете сделать это на Linux в Perl, используя модуль Font:: TTF.