Как реализовать автоматический выбор шрифта, который поддерживает данный язык?
Доброго времени суток.
При помощи ImageMagick в php я генерирую картинку с текстом. Проблема заключается в том, что я заранее не знаю, какой текст нужно будет писать на картинке (он будет подставляться динамически) и не знаю, на каком языке он будет. То есть если я задам, например, для этой надписи шрифт Helvetica и потом нужно будет написать текст на китайском, то получим только знаки вопроса. Как исправить эту проблему? И можно ли вообще как-то узнать в коде, поддерживает ли конкретный шрифт определенный символ?
Да, есть Noto, который поддерживает все языки. Однако там для каждого языка свой .ttf шрифт и проблема с выбором шрифта никуда не девается. А одного .ttf файла, который бы поддерживал все языки я не видел...
На ум приходит только сложная реализация: заранее сделать таблицу соответствия языка шрифту. А потом при помощи какого-нибудь YandexTranslator.API определять язык и через заранее сгенерированную таблицу нужный шрифт. Но это довольно непросто и костыльно, к тому же YandexTranslator имеет суточные лимиты.
Ну, есть шрифт Code2000, но он довольно некрасиво выглядит.
Задача к ImageMagick отношения, строго говоря, не имеет.
Проверка наличия символа в шрифте из PHP делается, например, вот так: https://www.pdflib.com/pdflib-cookbook/fonts/glyph...
Очевидно, что каждый символ проверять не обязательно и язык определять - не обязательно. Нужно определять набор символов, используемый в той или иной строке. Скажем, не важно, русский это язык, украинский, белорусский или сербский - важно, что символы в строке относятся диапазону символов Unicode - Cyrillic, что делается простой проверкой вхождения номеров символов в диапазон номеров.
NikHaker: Зачем знать язык, если вопрос сводится к тому, символы из какого диапазона (Basic Latin, Cyrillic, Arabic ...) используются в строке и есть ли поддержка этого диапазона в шрифте?
Moskus: а как определить, из какого диапазона данный символ?
И почему не обязательно проверять каждый символ? Вдруг часть текста на английском, а другая часть - на китайском...
Ну и я правильно понимаю, что всё равно нужно будет сделать таблицу соответствия вроде 'zh,jp' => 'Noto CJK'; 'en,ru,ua' => 'Noto Sans'?
NikHaker: Хм, ну вот берете сами диапазоны символов www.codetable.net/groups потом проверяете, входит ли код символа в один из них. Да, какую-то подобную таблицу сделать придется.
Что касается проверки каждого символа - в реальной ситуации ваше "вдруг" - маловероятно, а свою конкретную ситуацию вы, как это часто тут бывает, не описали. А она ведь может быть несколько менее разнообразна, чем общий случай.
Moskus: спасибо за ответ, благодаря подходу с диапазонами, система значительно улучшается - как минимум, больше нет необходимости в сторонних сервисах для идентификации языка.
Конкретная ситуация состоит в том, что текст, который я пишу - это имена и фамилии пользователей ВКонтакте. Вы считаете, что можно просто брать, например, первый символ и по нему определять, какой шрифт необходим?
NikHaker: Имена - это очень узкая задача по сравнению с текстом вообще. Вероятность того, что имя будет написано в виде Вася Ivanov - крайне мала, хотя и не нулевая - кто-то может выпендриваться, конечно.