Чтобы проверить смайлики с несколькими кодовыми точками, мне нужно было бы "запросить" GSUB
Список поиска .
Более простой способ проверить, поддерживается ли Emoji шрифтом в python.это использовать HarfBuzz или, точнее, harfpy .
Решение, которое я придумал:
from uharfbuzz import Face, Font, Buffer, ot_font_set_funcs, shape
def __isEmojiSupportedByFont(self, emoji: str) -> bool:
# Load font:
with open(r"C:\Windows\Fonts\seguiemj.ttf", 'rb') as fontfile:
self.fontdata = fontfile.read()
# Load font (has to be done for call):
face = Face(self.fontdata)
font = Font(face)
upem = face.upem
font.scale = (upem, upem)
ot_font_set_funcs(font)
# Create text buffer:
buf = Buffer()
buf.add_str(emoji)
buf.guess_segment_properties()
# Shape text:
features = {"kern": True, "liga": True}
shape(font, buf, features)
# Remove all variant selectors:
while len(infos) > 0 and infos[-1].codepoint == 3:
infos = infos[:-1]
# Filter empty:
if len(infos) <= 0:
return False
# Remove uncombined, ending with skin tone like "??":
lastCp = infos[-1].codepoint
if lastCp == 1076 or lastCp == 1079 or lastCp == 1082 or lastCp == 1085 or lastCp == 1088:
return False
# If there is a code point 0 or 3 => Emoji not fully supported by font:
return all(info.codepoint != 0 and info.codepoint != 3 for info in infos)
Благодаря халедосны и justvanrossum на GitHub / fonttols !