An improvement to Martin Monperrus's answer that fixes the support for ttc files:
# https://superuser.com/a/1452828
from fontTools.ttLib import TTFont
def char_in_font(unicode_char, path):
if path.endswith('.ttf'):
font = TTFont(path)
elif path.endswith('.ttc'):
# https://github.com/fonttools/fonttools/issues/541
font = TTFont(path, fontNumber=0)
else:
return False
for cmap in font['cmap'].tables:
if cmap.isUnicode():
if ord(unicode_char) in cmap.cmap:
return True
return False
from matplotlib.font_manager import findSystemFonts
def find_font_containing(unicode_char):
for path in findSystemFonts(fontpaths=None, fontext='ttf'):
if char_in_font(unicode_char, path):
return path
return None
Extend to checking multiple unicode characters:
from fontTools.ttLib import TTFont
def chars_in_cmap(unicode_chars, cmap):
for char in unicode_chars:
if ord(char) not in cmap.cmap:
return False
return True
def chars_in_font(unicode_chars, path):
if path.endswith('.ttf'):
font = TTFont(path)
elif path.endswith('.ttc'):
# https://github.com/fonttools/fonttools/issues/541
font = TTFont(path, fontNumber=0)
else:
return False
for cmap in font['cmap'].tables:
if cmap.isUnicode():
if chars_in_cmap(unicode_chars, cmap):
return True
return False
from matplotlib.font_manager import findSystemFonts
def find_font_containing(unicode_chars):
for path in findSystemFonts(fontpaths=None, fontext='ttf'):
if chars_in_font(unicode_chars, path):
return path
return None