unicode — определяет, существует ли глиф в данном шрифте

Я смотрю, есть ли способ, в PHP, чтобы определить, существует ли глиф для данного символа в шрифте.

Мой пример использования таков: я генерирую маленькие изображения с помощью Imagick — по сути, маленькие «значки», учитывая предоставленную пользователем информацию, и я бы очень хотел поддержать полный Unicode, включая emoji и еще много чего. На данный момент у меня есть несколько шрифтов, каждый из которых хорошо поддерживает «класс» символов (например, мой «основной» шрифт — Futura, и у меня есть Symbola для эмодзи и других символов, и мне может понадобиться добавить другой шрифт для Восточные глифы), но они не имеют достаточного перекрытия, чтобы использовать только один шрифт.

Я видел сообщение это предполагает, что коммерческое дополнение PDFlib может сделать это, но я хотел бы избежать коммерческих дополнений, если смогу. Я также видел, что надстройка PECL PS имеет ps_symbol_name (), но для этого требуется файл AFM, и, насколько я могу судить, я не могу использовать это с многобайтовыми шрифтами.

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

1

Решение

В зависимости от сложности того, что вам нужно сделать, посмотрите на https://github.com/pomax/php-font-parser, который я написал для той же цели (хотя с использованием gd а не имиджмейджик).

Обратите внимание, что поддерживаются только CMAP 4 и 12, которые охватывают UCS-2 и UCS-4. Более высокие кодовые точки, вероятно, не будут найдены, даже если они существуют в шрифте (в основном потому, что когда я писал это, Unicode еще не был загрязнен эмодзи).

Кроме того, вы можете использовать что-то вроде AdobeFDK tx программа, запускающая его против вашего шрифта через Оболочка-Exec или тому подобное, чтобы увидеть, если он находит определение глифа, или вы можете запустить весь шрифт через ТТХ, сохраните XML-таблицу таблицы CMAP как отдельный файл, а затем просто выполните проверку на предмет этого (это очень надежное решение, если ваш шрифт вряд ли сильно изменится)

2

Другие решения

Вот еще одно решение для проверки, поддерживается ли символ UTF-8 заданным шрифтом (OTF / TTF) с использованием PHP.

  1. Извлеките список всех поддерживаемых кодовых точек из вашего шрифта
  2. Преобразуйте ваш символ / строку в список соответствующих кодовых точек
  3. Сравните точки кода вашей строки со списком поддерживаемых
    кодовые точки по вашему шрифту, чтобы определить, поддерживаются ли они

Я хотел бы предложить использовать существующую библиотеку, как PDF-шрифт Пб извлечь список поддерживаемых кодовых точек из вашего шрифта.

Чтобы преобразовать вашу строку UTF-8 в кодовые точки, вы можете использовать этот фрагмент кода.

Вот полный пример для проверки того, что все буквы данной строки поддерживаются шрифтом OTF. (нужен php-font-lib, шрифт не включен)

Этот подход также может быть использован в качестве основы для простого подхода для определения лучшего шрифта для отрисовки заданной строки UTF-8:

  1. Просмотрите все существующие шрифты
  2. Сравнить охват строки поддерживаемыми символами для каждого шрифта в процентах
  3. Выберите шрифт с наибольшим покрытием или шрифтом по умолчанию в качестве запасного
2

По вопросам рекламы [email protected]