Я хочу создать изображение с текстом на нем с помощью библиотеки php gd.
все хорошо, но когда я пытаюсь написать слово из права на левый связанный язык (например, персидский) с использованием imagefttext()
, мой текст выполняет рендеринг слева направо (обратный), и символы больше не связаны.
пример связанных символов: пример несвязанных символов: م ا ه
Вот мой код:
header('Content-Type: image/jpeg'); $thumb_path = "..."; $font_path = "..." $img = imagecreatefromjpeg($thumb_path); $color = "..."; // __month is a Persian word : ( م ا ه --> ماه ) $text = $months." ".__month; imagefttext($img,29, 10, 230, 135, $color, $font_path, $text); // <-- imagejpeg($img);
Полученное изображение:
Я знаю, что моя проблема не в кодировании. Потому что я уже пробовал это:
$text = mb_convert_encoding($text, "HTML-ENTITIES", "UTF-8");
И результат тот же.
есть доступная библиотека, которая может решить эту проблему. и я знаю, что большинство из вас не знакомы с персидскими или арабскими языками, но мой вопрос в том, почему gd
не поддерживает право на левые связанные языки изначально?
может ли это быть ошибкой в gd-библиотеке?
Кажется, что ничего не помогает (установка правильной локали), встроенная поддержка PHP багги, вероятно, поэтому был создан сторонний пакет:
Работает как шарм:
Просто скопируйте библиотеку в свой каталог PHP (не обязательно быть администратором). Использование прост:
// init: include('php-gd-farsi-master/FarsiGD.php'); $gd = new FarsiGD(); .... // then convert your text: $tx = $gd->persianText($str, 'fa', 'normal');
в// init: include('php-gd-farsi-master/FarsiGD.php'); $gd = new FarsiGD(); .... // then convert your text: $tx = $gd->persianText($str, 'fa', 'normal');
Вам даже не нужно устанавливать правильную локаль! 🙂
Код всего примера:
<?php include('php-gd-farsi-master/FarsiGD.php'); $gd = new FarsiGD(); // Create a 300x100 image $im = imagecreatetruecolor(300, 100); $red = imagecolorallocate($im, 0xFF, 0x00, 0x00); $black = imagecolorallocate($im, 0x00, 0x00, 0x00); // Make the background red imagefilledrectangle($im, 0, 0, 299, 99, $red); // Path to our ttf font file //$font_file = './Vera.ttf'; $font_file = './cour.ttf'; // Draw the text 'PHP Manual' using font size 13 $text = imagecreatetruecolor(200, 60); imagefilledrectangle($text, 0, 0, 200, 60, $red); $str = '**ماه**'; $tx = $gd->persianText($str, 'fa', 'normal'); imagefttext($text, 24, 10, 10, 50, $black, $font_file,$tx ); $im = $text; // Output image to the browser header('Content-Type: image/png'); imagepng($im); imagedestroy($im); ?>
в<?php include('php-gd-farsi-master/FarsiGD.php'); $gd = new FarsiGD(); // Create a 300x100 image $im = imagecreatetruecolor(300, 100); $red = imagecolorallocate($im, 0xFF, 0x00, 0x00); $black = imagecolorallocate($im, 0x00, 0x00, 0x00); // Make the background red imagefilledrectangle($im, 0, 0, 299, 99, $red); // Path to our ttf font file //$font_file = './Vera.ttf'; $font_file = './cour.ttf'; // Draw the text 'PHP Manual' using font size 13 $text = imagecreatetruecolor(200, 60); imagefilledrectangle($text, 0, 0, 200, 60, $red); $str = '**ماه**'; $tx = $gd->persianText($str, 'fa', 'normal'); imagefttext($text, 24, 10, 10, 50, $black, $font_file,$tx ); $im = $text; // Output image to the browser header('Content-Type: image/png'); imagepng($im); imagedestroy($im); ?>
Правильно ли вы настроены локаль?
Глядя на таблицу локалей , персидский должен быть, вероятно, Farsi – fa_IR.UTF-8
из пакета fa_utf8
. Не забудьте проверить, правильно ли он установлен:
$rv = setlocale(LC_ALL, "fa_IR.UTF-8"); var_dump($rv);
Изменить: попробовал, и это тоже не помогает.