Python unicode rendering: как узнать, отсутствует ли символ юникода в шрифте

в Python, когда я отображаю символ Юникода, например китайский символ, с выбранным шрифтом, Иногда шрифт является неполным относительно общих символов Юникода и не может отображать рассматриваемый символ Юникода. В этих случаях, если я вызываю функцию "печать", вывод обычно выглядит как квадратное поле, независимо от того, как должен выглядеть базовый символ Юникода.

конечно, как только я напечатаю символ unicode, я могу посмотреть на вывод, а затем определите, что выбранный шрифт пропускает определенный символ Юникода. Но есть ли способ сказать, прежде чем печатать, автоматически, без необходимости прибегать к моим собственным человеческим глазам, чтобы определить, включен ли символ в шрифт?

Я бы также уточнил, что знаю шрифты, которые являются более полными, чем другие. Мой вопрос не в том, какой шрифт я могу использовать, чтобы, если я вызову "печать", у меня обычно был бы разумный вывод. Пожалуйста, также игнорируйте вопрос о том, как я печатаю символ или если я на самом деле хочу напечатать символ. Мой вопрос просто, для любого данного шрифта, как я могу сказать, если символ Юникода отсутствует в шрифте, без использования какого-либо ручного процесса, полагающегося на человеческое суждение о выходе.

1 ответов


см https://unix.stackexchange.com/questions/247108/how-to-find-out-which-unicode-codepoints-are-defined-in-a-ttf-file

короче говоря, можно установить пакет fonttools, предоставить ему путь к любому .ttf-файл шрифта, представляющий интерес, и проверьте, включена ли длинная форма интересующего символа юникода в таблицу карт Юникода файла шрифта.

from fontTools.ttLib import TTFont
font = TTFont(fontpath)   # specify the path to the font in question


def char_in_font(unicode_char, font):
    for cmap in font['cmap'].tables:
        if cmap.isUnicode():
            if ord(unicode_char) in cmap.cmap:
                return True
    return False

затем просто вызовите функцию char_in_font, чтобы проверить, включен ли символ Юникода в шрифте.