Problème pour afficher des caractères spéciaux avec GD

polarbird Messages postés 125 Statut Membre -  
polarbird Messages postés 125 Statut Membre -
Bonsoir,
Je rencontre actuellement un problème pour afficher des caractères spéciaux en générant une image avec la fonction imagettftext() de PHP GD dans une boucle for. Lorsque je génère mon image, je vois des caractères comme é.
Voici mon code, il n'est pas particulièrement compliqué.
$code = 'ąćęłńóśźżĄĆĘŁŃÓŚŹŻ';
$size = 20;
$marge = 15;
$font = '../keyboard/NotoSans-Regular.ttf';

$text_colour = imagecolorallocate($[/contents/391-fichier-img img], 255, 255, 255);

$chars_list = trim($_POST['chars']);
$chars_array =  explode(';', $chars_list);
$count = count($chars_array);

for($i = 0; $i < $count;++$i)
{
    $box = imagettfbbox($size, 0, $font, $chars_array[$i]);
    $largeur = $box[2] - $box[0];
    $largeur_lettre = round($largeur/$count);
    $hauteur = 50;
    $img = imagecreate($largeur+$marge, $hauteur);
    $l = $chars_array[$i];
    $angle = 0;
    imagettftext($img,$size,$angle,($i*$largeur_lettre)+$marge, $hauteur, $text_colour, $font, $l);
}
header("Cache-Control: no-cache, must-revalidate");
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);

Par avance je vous remercie de votre aide.
Cordialement,
polarbird

A voir également:

3 réponses

NHenry Messages postés 15479 Statut Modérateur 366
 
0
polarbird Messages postés 125 Statut Membre 1
 
Bonsoir,
Je suis déjà allé sur cette page et ai essayé les solutions qui y étaient proposées mais ça ne marche toujours pas.
Cordialement,
polarbird
0
jordane45 Messages postés 40050 Statut Modérateur 4 758
 
0
polarbird Messages postés 125 Statut Membre 1
 
Bonjour jordane45,

Merci de ta réponse. J'ai regardé ton lien avec attention et le seul truc qui puisse m'aider est la fonction utf8_encode. Je l'ai appliquée à mon code. J'ai fais quelques modifications depuis hier sur mon code et ça marche déjà mieux.

GD arrive à détecter le bon nombre de caractères que contient ma chaîne. Mais je pense que le problème vient d'ailleurs, c'est-à-dire de ma boucle for. Je reposte mon code amélioré avec lequel j'obtiens toujours des signes comme é.

$mot = utf8_encode('ąćęłńóśźż');

$size = 20;
$marge = 15;
$font = '../keyboard/NotoSans-Regular.ttf';

$box = imagettfbbox($size, 0, $font, $mot);
$largeur = $box[2] - $box[0];
$hauteur = $box[1] - $box[7];
$largeur_lettre = round($largeur/strlen($mot));

$img = imagecreate($largeur+$marge, $hauteur+$marge);
$blanc = imagecolorallocate($img, 255, 255, 255); 
$noir = imagecolorallocate($img, 0, 0, 0);


for($i = 0; $i < strlen($mot);++$i)
	{
		$l = $mot[$i];
		$angle = mt_rand(-35,35);
		imagettftext($img,$size,$angle,($i*$largeur_lettre)+$marge, $hauteur+mt_rand(0,$marge/2),$noir, $font, $l);	
	}

header("Cache-Control: no-cache, must-revalidate");
header('Content-type: image/png');
imagepng($img);
imagedestroy($img);
0
Reivax962 Messages postés 3742 Statut Membre 1 011
 
Bonjour,

Je n'ai pas de moteur php sous la main pour vérifier, mais à mon avis, le problème vient de :
$l = $mot[$i];

Tu es dans le cadre d'un encodage multi-octet, l'accès par index à un caractère de la chaîne a de forte chance de ne ramener qu'un octet.

Pour contourner ce problème, utilise les fonctions de manipulations de chaînes multi-octets mb_* (mb comme multi-byte).

Par exemple, pour récupérer la longueur de la chaîne, dans ton for :
for($i = 0; $i < mb_strlen($mot);++$i)


Et pour récupérer le $i-ème caractère :
$l = mb_substr($mot, $i, 1);


Xavier
0
polarbird Messages postés 125 Statut Membre 1
 
Bonjour,
Merci de votre réponse. J'ai essayé la solution que vous proposiez, mais hélas, ce la ne fonctionne toujours pas. J'obtiens toujours le même résultat. En tout cas, vous avez soulevé le bon côté du problème, c'est-à-dire la boucle for, j'espère que quelqu'un saura trouver ce qui cloche.
Cordialement,
polarbird
0