Вопрос или проблема
Unicode содержит несколько специальных “символов”, которые не отображаются большинством шрифтов. Я хочу использовать один из них, видеокамеру.
Кажется, что такой символ действительно существует и имеет кодовую точку U+1F4F9. Когда я посещаю http://graphemica.com/%F0%9F%93%B9, я вижу его отображение как на веб-странице, так и в адресной строке Firefox. Поэтому я предполагаю, что у меня как минимум один шрифт в системе, который содержит этот глиф.
Но когда я вставляю его в 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 позволяет найти список шрифтов, которые включают в себя указанный символ.
- Перейдите по указанной ссылке.
- Введите код символа или его представление в Unicode.
- Сайт выведет список шрифтов, которые поддерживают данный символ.
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 — все это простые и эффективные способы решения этой задачи. Надеемся, что это руководство окажется полезным в вашем поиске подходящего шрифта.