Как мне узнать, в каком шрифте содержится определенный специальный символ?

Вопрос или проблема

Unicode содержит несколько специальных “символов”, которые не отображаются большинством шрифтов. Я хочу использовать один из них, видеокамеру.

Кажется, что такой символ действительно существует и имеет кодовую точку U+1F4F9. Когда я посещаю http://graphemica.com/%F0%9F%93%B9, я вижу его отображение как на веб-странице, так и в адресной строке Firefox. Поэтому я предполагаю, что у меня как минимум один шрифт в системе, который содержит этот глиф.

url with video camera glyph displays correctly

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

Как мне узнать, какой из установленных шрифтов может отображать этот “символ”?

Попробуйте эту страницу: www.Fileformat.info

https://www.fileformat.info/info/unicode/char/1f4f9/fontsupport.htm

Там вы можете запросить символы Unicode и получить список поддерживающих шрифтов.

Следующий скрипт на Python выведет все шрифты, содержащие символ (протестировано на моейLinux машине).

import unicodedata
import os

fonts = []

for root,dirs,files in os.walk("/usr/share/fonts/"):
    for file in files:
       if file.endswith(".ttf"): fonts.append(os.path.join(root,file))


from fontTools.ttLib import TTFont

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

def test(char):
    for fontpath in fonts:
        font = TTFont(fontpath)   # задайте путь к интересующему шрифту
        if char_in_font(char, font):
            print(char + " "+ unicodedata.name(char) + " в " + fontpath) 

test(u"😺")
test(u"🐈")

На моей машине это дает:

😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSansCondensed.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSansCondensed-Bold.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Oblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSansCondensed-Oblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSansCondensed-BoldOblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-BoldOblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSansCondensed.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Bold.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSans-Oblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-Oblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSansCondensed-BoldOblique.ttf
😺 ЛИЦО С УЛЫБКОЙ И С ОТКРЫТЫМ РТОМ  в /usr/share/fonts/truetype/dejavu/DejaVuSans-BoldOblique.ttf
🐈 КОШКА  в /usr/share/fonts/truetype/noto/NotoSansSymbols2-Regular.ttf

Я полностью понимаю вопрос, так как сам столкнулся с такой же проблемой:

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

Попробуйте вставить скопированный текст/символ в пустой документ Microsoft Word. Содержимое должно отображаться корректно, если в Word установлено значение “Сохранить формат исходного текста” по умолчанию для вставленного текста. Если это так, выделите содержимое, и меню шрифтов Word покажет вам исходный шрифт на вашем компьютере, который содержит необходимый символ. Конечно, может быть и другие, но хотя бы так вы быстро и просто найдете один подходящий шрифт.

Улучшение к ответу Мартина Монпервюра, которое исправляет поддержку файлов ttc:

# 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

Расширение для проверки нескольких символов Unicode:

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

Ответ или решение

Чтобы определить, какой шрифт может отображать специальный символ, такой как видеокамера (кодовая точка U+1F4F9), необходимо учесть несколько аспектов. В данном ответе мы рассмотрим ключевые шаги и инструменты для поиска подходящих шрифтов, а также предложим программное решение.

1. Понимание проблемы

Вы уже столкнулись с распространенной ситуацией: символ отображается в одном приложении (в данном случае в браузере), но не отображается в другом (например, в Inkscape). Это происходит потому, что разные приложения могут использовать разные механизмы для обработки шрифтов и не все шрифты поддерживают все символы Unicode.

2. Использование веб-ресурсов

Один из простых способов узнать, какие шрифты поддерживают конкретный символ, — это использовать онлайн-ресурсы. Например, сайт fileformat.info позволяет найти список шрифтов, которые включают в себя указанный символ.

  1. Перейдите по указанной ссылке.
  2. Введите код символа или его представление в Unicode.
  3. Сайт выведет список шрифтов, которые поддерживают данный символ.

3. Программное решение

Если вам нужно протестировать несколько символов или шрифтов, можно использовать Python и библиотеку fontTools для автоматизации этого процесса. Ниже приведен пример скрипта, который проверяет установленные шрифты на предмет наличия в них указанного символа.

import unicodedata
import os
from fontTools.ttLib import TTFont
from matplotlib.font_manager import findSystemFonts

def char_in_font(unicode_char, path):
    try:
        font = TTFont(path)
        for cmap in font['cmap'].tables:
            if cmap.isUnicode() and ord(unicode_char) in cmap.cmap:
                return True
    except Exception as e:
        print(f"Error reading font {path}: {e}")
    return False

def find_fonts_containing(unicode_char):
    fonts_with_char = []
    for font_path in findSystemFonts(fontext="ttf"):
        if char_in_font(unicode_char, font_path):
            fonts_with_char.append(font_path)
    return fonts_with_char

# Пример использования
video_camera_char = u"\U0001F4F9"  # Вводим символ видеокамеры
fonts = find_fonts_containing(video_camera_char)

if fonts:
    print("Шрифты, содержащие символ видеокамеры:")
    for font in fonts:
        print(font)
else:
    print("Нет шрифтов, содержащих указанный символ.")

4. Использование Microsoft Word

Если вы хотите быстро определить, какой шрифт поддерживает нужный символ, попробуйте вставить символ в Microsoft Word. Если он отображается корректно, выделите его, и в меню шрифтов увидите название шрифта, который его поддерживает.

Заключение

Эти методы помогут вам найти шрифт, который поддерживает специальные символы Unicode на вашем компьютере. Использование онлайн-ресурсов для проверки шрифтов, написание скрипта на Python и пробные вставки в Word — все это простые и эффективные способы решения этой задачи. Надеемся, что это руководство окажется полезным в вашем поиске подходящего шрифта.

Оцените материал
Добавить комментарий

Капча загружается...