Написание шрифтов хинди с помощью библиотеки GD не отображается должным образом

Если я хочу написать следующий текст на изображении:

दीक्षा शिक्षा क्या क्या हो गया!

Тогда он не дает ожидаемого результата, а вместо этого печатает текст на картинке, как показано ниже. Я перепробовал почти все шрифты деванагари ttf и unicode, доступные для хинди.

Текст на хинди

Вот код:

$quote="दीक्षा शिक्षा क्या क्या हो गया!";
imagettftext($new_pic, $fontsize, 0, 170, 155-$hidd/2, $color, $font, $quote);

Любая помощь будет очень признательна.


person Vishal Mohla    schedule 17.01.2014    source источник
comment
Каков желаемый путь? Для меня (как для человека, не говорящего на индуистском языке) текст на картинке выглядит так же, как написанный текст (я вижу только больше акцентов (?) на картинке под символом क्, но, похоже, это было намерением).   -  person Marcel Korpel    schedule 17.01.2014
comment
Привет! Большое спасибо за ваш ответ. Проблема в том, что это не должно быть так, как грядет. Я пробовал много шрифтов ttf unicode, и все они дают одинаковые проблемы.   -  person Vishal Mohla    schedule 17.01.2014
comment
Всем, кто знает хинди. Текст, распечатанный на картинке, неверен. С Уважением   -  person Vishal Mohla    schedule 17.01.2014
comment
В дополнение к настоящему UTF-8 я безуспешно пробовал UTF-16, UTF-32. Строка отлично печатается в документе, но когда она отправляется в функцию imagettfext, вывод искажается.   -  person Vishal Mohla    schedule 18.01.2014
comment
так вы нашли какое-нибудь решение ??   -  person Gkills    schedule 07.10.2016
comment
Любое решение работает для вас до сих пор?   -  person xySVerma    schedule 13.12.2017


Ответы (3)


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

person Abu Saad Papa    schedule 15.03.2018

Я не очень хорошо разбираюсь в хинди, но я думаю, что используемая вами библиотека GD не использует правила языка хинди, которые изменяют порядок отображения глифов. Я не знаю, что это за правила, но думаю, что они закодированы в таблицах GSUB или GPOS шрифта. GSUB управляет способом отображения последовательности глифов, а GPOS управляет расстоянием между глифами. Я предполагаю, что библиотека GD не обрабатывает таблицы GPOS или GSUB, поэтому порядок вашей строки в imagettfext соответствует порядку глифов в строке. Возможно, вам потребуется реализовать в сценарии некоторый код обработки строк, который принимает строки и правильно упорядочивает символы, зная, что библиотека GD отобразит их в том порядке, в котором они находятся в строке.

Используйте приведенный ниже код для следующего правила хинди.

string changeHindiGlyph(string originalText)
{
    string[] words = originalText.Split(new char[]{' '});

    for(int k = 0; k < words.Length; k++)
    {
        if(words[k].Contains("\u093f")) // check if the word contains "i" vowel
        {
            char[] arr = words[k].ToCharArray();
            for (int i = 0; i < arr.Length -1 ; i++)
            {
                //interchange the order of "i" vowel
                if(arr[i] == '\u093f')
                {
                    arr[i] = arr[i-1];
                    arr[i-1] = '\u093f';
                }
            }

            words[k] = new string(arr);
        }
    }

    originalText = string.Join(" ", words);

    return originalText;
}

Я использовал C# в приведенном выше коде, вы можете преобразовать его в свой язык сценариев. Точно так же вы можете включить в код больше правил, чтобы получить нужный текст в библиотеке GD. Надеюсь, это решит вашу проблему.

person Abu Saad Papa    schedule 16.12.2014
comment
Он исправляет только u093f, который работает хорошо, но как вы исправите остальные, такие как замена половинной формы и другие функции, такие как эти 2 слова: प्रस्थान शर्त - person xySVerma; 14.12.2017
comment
@SourabhV просто посмотрите код swapnil jain и преобразуйте его в C#. - person Abu Saad Papa; 18.12.2017

person    schedule
comment
У вас случайно нет версии C#? - person xySVerma; 13.12.2017
comment
Это отличное решение. Тем не менее, он еще не охватил नुक्ता. Он распечатывает नुक ् ता. Какие-либо предложения? - person Adarsh Khatri; 13.04.2021
comment
Подробнее об этом: अख्तियार отображается некорректно. - person Adarsh Khatri; 13.04.2021