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

polarbird Messages postés 104 Date d'inscription   Statut Membre Dernière intervention   -  
polarbird Messages postés 104 Date d'inscription   Statut Membre Dernière intervention   -
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 15219 Date d'inscription   Statut Modérateur Dernière intervention   365
 
0
polarbird Messages postés 104 Date d'inscription   Statut Membre Dernière intervention   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 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
0
polarbird Messages postés 104 Date d'inscription   Statut Membre Dernière intervention   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 3672 Date d'inscription   Statut Membre Dernière intervention   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 104 Date d'inscription   Statut Membre Dernière intervention   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