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

Fermé
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 - 26 sept. 2017 à 22:51
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 - 28 sept. 2017 à 17:25
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 15194 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 23 février 2025 353
26 sept. 2017 à 22:57
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
26 sept. 2017 à 23:10
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 38446 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 février 2025 4 739
27 sept. 2017 à 07:46
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
27 sept. 2017 à 23:01
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 jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 28 sept. 2017 à 12:21
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 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
28 sept. 2017 à 17:25
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