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 -
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é.
Par avance je vous remercie de votre aide.
Cordialement,
polarbird
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:
- Problème pour afficher des caractères spéciaux avec GD
- Caractère spéciaux - Guide
- Caractères spéciaux - Guide
- Caractères spéciaux mac - Guide
- Caractères ascii - Guide
- Afficher appdata - Guide
3 réponses
"é" typique de l'UTF-8 interprété en ISO-*
https://stackoverflow.com/questions/9458317/working-with-gd-imagettftext-and-utf-8-characters
https://stackoverflow.com/questions/9458317/working-with-gd-imagettftext-and-utf-8-characters
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 é.
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);
Bonjour,
Je n'ai pas de moteur php sous la main pour vérifier, mais à mon avis, le problème vient de :
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 :
Et pour récupérer le $i-ème caractère :
Xavier
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
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
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
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