Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pb d'affichage : imagettftext et e dans l'o (¼)

4 réponses
Avatar
Thierry
Bonjour,

J'ai un petit soucis d'affichage de caractère :

si j'écris :

$text = "æ à ¼ â ¤ a ç à";
echo $text;

j'affiche : æ à ¼ â ¤ a ç à
(bref, ça marche)

Si je fais :

[...]
$text = "æ à ¼ â ¤ a ç à";
imagettftext($im, 14, 0, 8, 18, $black, $font, $text);
imagepng($im);

j'obtiens :
æ [carré vide] à [carré vide] â [carré vide] a
bref, les ½ et ¤ ne s'affichent pas correctement (carré vide), tandis
que le ç et le à ne s'affichent pas du tout, sous aucune forme.

le remplacement de :
$text = "æ à ¼ â ¤ a ç à";
par :
$text =utf8_encode("æ à ¼ â ¤ a ç à");
permet d'obtenir l'affichage de :
æ [carré vide] à [carré vide] â [carré vide] a ç à
bref, ça résoud le pb d'affichage des "ç" et des "à", mais pas des "¼"
ni des "¤".

J'ai testé avec les polices arial, vera et georgia : ce n'est donc pas à
priori à cause de l'inexistence d'un caractère dans la police.

J'ai moultement cherché depuis 2 jours via google : je n'ai rien trouvé
qui fonctionne.

Peut-être avez-vous la solution ?

Merci d'avance !
--
Thierry

4 réponses

Avatar
Cleo
Salut,

Le code que tu as fourni a été écrit avec un éditeur retranscrivant chaque
caractère dans un codepage particulier.
Par example php-dev produit du code en CP1252, phpeclipse produit de
l'UTF-8, etc... .

1. L'interpréteur php ne fait aucune conversion [codepage éditeur ->
Unicode] lors de la création des chaines en mémoire.
2. A priori, la fonction imagettftext nécessite un text en utf-8 ...

Je te conseillerais donc de déterminer dans quel codepage est transcrit ton
code, puis d'utiliser le code suivant:

$text = "æ à ¼ â ¤ a ç à";
$textutf8 = iconv( **CODEPAGEEDITEUR**, "UTF-8", $text ) ;
imagettftext($im, 14, 0, 8, 18, $black, $font, $textutf8);
imagepng($im);
etc ...


Amicalement
--
Cléo.
Avatar
Thierry
Thierry wrote:
[...]


Deux points :

1) j'ai trouvé un semblant de début de solution :

[...]
$text = html_entity_decode ("Œ",ENT_NOQUOTES,'utf-8');
imagettftext($im, 14, 0, 8, 18, $black, $font, $text);
imagepng($im);

permet l'affichage correct d'un "¼" (e dans l'o).

cenpendant, ça ne marche qu'en ("internal preview" avec DEV-PHP), sur ma
propre machine (peut-être parce que c'est (probablement) PHP 5 qui est
utilisé alors qu'avec un navigateur via localhost, j'utilise PHP 4,
comme mon hébérgeur.

L'erreur renvoyé est :
Warning: cannot yet handle MBCS in html_entity_decode()! in
C:apachefriendsxampphtdocsTESTgraphique.php on line 307
(ce qui n'est absloument pas clair pour moi)

Avec :
$text = html_entity_decode ("Œ",ENT_NOQUOTES,'iso-8859-15');
imagettftext($im, 14, 0, 8, 18, $black, $font, $text);
imagepng($im);

j'obtiens l'affichage d'un "1/4" (en un seul caractère), ce qui n'est
pas vraiment attendu. Cette solution fonctionne donc avec un navigateur
sur localhost, mais n'affiche pas le bon caractère.

2) second point :

$text = "æ à ¼ â ¤ a ç à";
[...]


pas sûr que les caratères de mon message précédant s'affichent
correctement pour tout le monde(pourtant, je suis en latin-15).

Donc vous n'allez rien comprendre.

Dans l'ordre, ma liste de caractères est donc :

e dans l'a
a accent grave
e dans l'o
a circonflexe
symbole euro
a
c cédille
a accent grave

--
Thierry

Avatar
Olivier Miakinen

J'ai un petit soucis d'affichage de caractère :

si j'écris :

$text = "æ à ¼ â ¤ a ç à";
echo $text;

j'affiche : æ à ¼ â ¤ a ç à
(bref, ça marche)


Déjà là, il ne suffit pas de les voir s'afficher correctement pour
savoir comment faire la suite : il faudrait savoir quel encodage est
utilisé, les plus probables étant windows-1252, ISO-8859-15 et UTF-8.

Si je fais :

[...]
$text = "æ à ¼ â ¤ a ç à";
imagettftext($im, 14, 0, 8, 18, $black, $font, $text);
imagepng($im);

j'obtiens :
æ [carré vide] à [carré vide] â [carré vide] a
bref, les ½ et ¤ ne s'affichent pas correctement (carré vide), tandis
que le ç et le à ne s'affichent pas du tout, sous aucune forme.


Déjà, cela montre que ce n'était pas de l'UTF-8 puisque, d'après la doc,
c'est ce qu'il attend.

le remplacement de :
$text = "æ à ¼ â ¤ a ç à";
par :
$text =utf8_encode("æ à ¼ â ¤ a ç à");
permet d'obtenir l'affichage de :
æ [carré vide] à [carré vide] â [carré vide] a ç à
bref, ça résoud le pb d'affichage des "ç" et des "à", mais pas des "¼"
ni des "¤".


Le fait que tout s'affiche correctement sauf « ¼ » et « ¤ » laisse
supposer que ton encodage par défaut est win-1252. En effet, utf8_encode
suppose ISO-8859-1 en entrée (et UTF-8 en sortie). Si tu étais en
ISO-8859-15, « ¤ » dont le code est 164 serait interprété comme un
symbole monétaire international (une sorte de rond avec quatre épines,
que certains appellent « trou du cul »), et « ¼ » dont le code est 188
serait interprété comme un caractère « 1/4 ».

J'ai testé avec les polices arial, vera et georgia : ce n'est donc pas à
priori à cause de l'inexistence d'un caractère dans la police.


Non, c'est dû à un mauvais encodage.

Peut-être avez-vous la solution ?


Essaye :
$text = iconv("CP1252", "UTF-8", "æ à ¼ â ¤ a ç à");

Mais tu peux aussi éditer ton fichier PHP avec un éditeur qui connaît
plusieurs encodages, et le sauvegarder en UTF-8.

Avatar
Olivier Miakinen
1) j'ai trouvé un semblant de début de solution :

[...]
$text = html_entity_decode ("Œ",ENT_NOQUOTES,'utf-8');
imagettftext($im, 14, 0, 8, 18, $black, $font, $text);
imagepng($im);

permet l'affichage correct d'un "¼" (e dans l'o).

cenpendant, ça ne marche qu'en ("internal preview" avec DEV-PHP), sur ma
propre machine (peut-être parce que c'est (probablement) PHP 5 qui est
utilisé alors qu'avec un navigateur via localhost, j'utilise PHP 4,
comme mon hébérgeur.


Quel PHP 4 ? Inférieur ou supérieur à 4.3.0 ?

<http://fr.php.net/manual/fr/function.html-entity-decode.php>
html_entity_decode
(PHP 4 >= 4.3.0, PHP 5)
</>

Par ailleurs, attention : tu as mis comme encodage 'utf-8' alors que
c'est 'UTF-8' qui est documenté.

L'erreur renvoyé est :
Warning: cannot yet handle MBCS in html_entity_decode()! in
C:apachefriendsxampphtdocsTESTgraphique.php on line 307
(ce qui n'est absloument pas clair pour moi)


Pour moi non plus.

Avec :
$text = html_entity_decode ("&OElig;",ENT_NOQUOTES,'iso-8859-15');
imagettftext($im, 14, 0, 8, 18, $black, $font, $text);
imagepng($im);

j'obtiens l'affichage d'un "1/4" (en un seul caractère), ce qui n'est
pas vraiment attendu. Cette solution fonctionne donc avec un navigateur
sur localhost, mais n'affiche pas le bon caractère.


Cela confirme mon intuition, que tu es en CP1252 par défaut. CP1252 est
un sur-ensemble de ISO-8859-1, et le caractère '1/4' dans ces deux
encodages est à la même position que le « ¼ » en ISO-8859-15 (tiens, tu
l'as écrit en minuscules aussi, donc ce n'est pas la casse de 'utf-8'
qui est en cause plus haut).

2) second point :

$text = "æ à ¼ â ¤ a ç à";
[...]


pas sûr que les caratères de mon message précédant s'affichent
correctement pour tout le monde(pourtant, je suis en latin-15).


Si, si, parfaitement. Tu peux avoir CP1252 par défaut sur la machine, et
que Mozilla le traduise en ISO-8859-15. Il fait ça très bien.