Ошибка при записи арабского изображения
Мой предыдущий связанный вопрос:
PHP работа с изображениями: напишите полное слово на арабском языке, шрифт TTF
Моя проблема была:
- Если я хочу написать
احمد
в изображении это выглядит какد م ح ا
- Ну, я исправил это и теперь вывод:
ا ح م د
Используя эту функцию:
function arab($word){
$w = explode(' ',$word) ;
$f = array(array('ا','أ'),'ب','ت','ث','ج','ح','د','ذ','ر','ز','س','ش','ص','ض','ط','ظ','ع','غ','ف','ق','ك','ل','م','ن','ه','و','ى');
$t = array(array('ا_','أ_'),'ب_','ت_','ث_','ج_','ح_','د_','ذ_','ر_','ز_','س_','ش_','ص_','ض_','ط_','ظ_','ع_','غ_','ف_','ق_','ك_','ل_','م_','ن_','ه_','و_','ى_');
$my_arab = '' ;
foreach($w as $wo)
{
$r = array() ;
$wo = str_replace($f , $t ,$wo);
$ne = explode('_', $wo) ;
foreach($ne as $new) {
$new = str_replace('_','',$new) ;
array_unshift($r , $new);
}
$my_arab .= ' '.implode('',$r) ;
}
return trim($my_arab) ;
}
Но новая проблема:
ا ح م د
(разделенные буквы), где это должно быть:
احمد
Как я могу это исправить?
3 ответа
Ваш способ обращения арабских символов не учитывает природу связанных глифов. Тем не менее, это правильный прием для решения проблемы PHP/GD, не поддерживающей автоматически языки RTL, такие как арабский.
Что вам нужно сделать, это использовать библиотеку ar-php, которая делает именно то, что вы хотели.
Убедитесь, что кодировка PHP-файла указана в формате Unicode / UTF.
например,> откройте Блокнот> Сохранить как> Кодировку как UTF-8:
Пример использования арабской типографии в PHP с использованием imagettftext:
<?php
// The text to draw
require('./I18N/Arabic.php');
$Arabic = new I18N_Arabic('Glyphs');
$font = './DroidNaskh-Bold.ttf';
$text = $Arabic->utf8Glyphs('لغةٌ عربيّة');
// Create the image
$im = imagecreatetruecolor(600, 300);
// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 599, 299, $white);
// Add the text
imagettftext($im, 50, 0, 90, 90, $black, $font, $text);
// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im, "./output_arabic_image.png");
echo 'open: ./output_arabic_image.png';
imagedestroy($im);
?>
Выходы:
Вы должны использовать Биди конвертер, я использую его, чтобы написать персидский в изображениях
<?php
#----------------------------------------------------------------------
# Persian Image 1
#----------------------------------------------------------------------
# Copyright (c) 2011 Saeed Arab Sheybani
#----------------------------------------------------------------------
# This program is under the terms of the GENERAL PUBLIC LICENSE (GPL)
# as published by the FREE SOFTWARE FOUNDATION. The GPL is available
# through the world-wide-web at http://www.gnu.org/copyleft/gpl.html
#----------------------------------------------------------------------
# Authors: Saeed Arab Sheybani <webrefer@Gmail.com>
# Thanks to TCPDF project @ http://www.tecnick.com/ i use unicode_data.php and bidi.php from this site
#----------------------------------------------------------------------
/**
* A function to change persian or arabic text from its logical condition to visual
*
* @author Saeed Arab Sheybani <webrefer@Gmail.com>
* @param string Main text you want to change it
* @param boolean Apply e'raab characters or not? default is true
* @param boolean Which encoding? default it "utf8"
* @param boolean Do you want to change special characters like "allah" or "lam+alef" or "lam+hamza", default is true
*/
function Persian_image(&$str)
{
include_once('bidi.php');
$text = explode("\n", $str);
$str = array();
foreach($text as $line){
$chars = bidi::utf8Bidi(bidi::UTF8StringToArray($line), 'R');
$line = '';
foreach($chars as $char){
$line .= bidi::unichr($char);
}
$str[] = $line;
}
$str = implode("\n", $str);
}
Я использовал это без каких-либо проблем: https://github.com/omid/Persian-Log2Vis
ОБНОВЛЕНИЕ: я разветвлял Persian-Log2Vis и изменил некоторые коды для нормальной работы. https://github.com/tahmasebi/Persian-Log2Vis