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

Encodage caractère : bizzareries (suite)

1 réponse
Avatar
p.brie
Bonjour,

Je reprends des =E9l=E9ments de la discussion de jeudi : "Encodage
caract=E8re : bizzareries". merci =E0 tous ceux qui m'ont apport=E9s leurs
connaissances.

C'est un peu long pour arriver =E0 la question, mais je souhaitais faire
un r=E9sum=E9 des =E9pisodes pr=E9c=E9dents.

Question initiale : soit le code suivant

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns=3D"http://www.w3.org/1999/xhtml" xml:lang=3D"fr" lang=3D"fr">
<head>
<meta http-equiv=3D"content-type" content=3D"text/html;
charset=3DISO-8859-1" />
<title>Essai</title>
</head>

<body>
<p> C'est 15 &euro;</p>
</body>
</html>
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Affichage

C'est 15 EURO (sigle de l'euro)


M=EAme source mais on se place en ISO 8859-15
<meta http-equiv=3D"content-type" content=3D"text/html;
charset=3DISO-8859-15" />

J'utilise donc ISO-8859-15 qui permet entre autres pour pouvoir g=E9rer
des caract=E8res comme EURO qui ne faisaient pas partie de ISO 8859-1

Affichage
C'est 15 (suivi d'un carr=E9)
Bref tout le contraire que ce que je pensais ... une id=E9e ?

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

La r=E9ponse d'olivier Miakinen m'a paru la plus didactique (merci =E0
tous les autres)


Pour comprendre ce qui se passe, il faut avoir une id=E9e de ce qui se
passe aux positions 80 et A4 (hexa) dans les tables ISO-8859-1,
ISO-8859-15 et CP1252. Ce que j'appelle << position dans une table >>
c'est << quel caract=E8re sera affich=E9 si j'envoie un octet qui a cette
valeur en d=E9clarant utiliser cette table >>.

Voir http://www.miakinen.net/vrac/charsets/ pour y voir plus clair.

Ainsi, un octet de valeur 41 hexa affichera un << A >> dans les trois
tables (ISO-8859-1, ISO-8859-15 et CP1252), ainsi d'ailleurs que dans
*toutes* les tables qui sont bas=E9es sur US-ASCII.

Un octet de valeur A4 affichera un =A4 dans ISO-8859-1 et dans CP1252,
mais un EURO dans ISO-8859-15.


Un octet de valeur 80 affichera un EURO dans CP1252, et *en principe* il
ne devrait rien afficher dans ISO-8859-1 et ISO-8859-15. Pourtant, *en
pratique*, de nombreux navigateurs et courrielleurs trouvent sympa de
faire comme si ISO-8859-1 =E9tait identique =E0 CP1252 : ils affichent
donc un EURO dans ISO-8859-1, et rien (ou un carr=E9 vide, ou un point
d'interrogation) dans ISO-8859-15.


Voil=E0, le d=E9cor est plant=E9. Maintenant voyons ce qui s'est pass=E9 sur=

ta page. Tu es en ISO-8859-1, et tu as voulu coder un EURO. Comme ton
=E9diteur fonctionne en CP1252, il a mis un octet valant 80. Quand tu
relis la page avec un navigateur qui est lui-m=EAme assez coulant, il a
bien vu que tu es soi-disant en ISO-8859-1, mais puisque le caract=E8re
80 n'y existe pas alors qu'il vaut un EURO en CP1252, il a la
gentillesse de t'afficher un EURO.

Si maintenant tu changes de charset sans rien changer d'autre, le
navigateur sera moins sympa (ou plus rigoureux) et il ne t'affichera
rien.

Voil=E0. Ai-je =E9t=E9 suffisamment clair ?

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D

Olivier tu as =E9t=E9 tr=E8s tr=E8s clair mais cela amm=E8ne une autre quest=
ion.

Je travaille sous windows XP.

En gros ce que tu m'annonce c'est que mon navigateur (que ce soit IE
ou Firefox d'ailleurs) cherchent eux m=EAmes ce qu'ils pourraient
afficher quand ils n'ont rien =E0 afficher (cas du caract=E8re 0x80).

Donc si je developpe un site et que je ne fais pas gaffe, je peux donc
croire que tout va bien alors qu'en fait "=E7a merdoie".

Question 1 :
Comment =EAtre s=FBr que mon Navigateur respecte bien le charset qu'il
trouve sur la page Web sans chercher =E0 essayer d'optimiser ?

Question 2 :
Puis je utiliser sous Windows un =E9diteur de texte qui me code dans le
charset voulu et non en CP1252 ? (Question subsidiaire par ce que
c'est mon =E9diteur pr=E9f=E9r=E9, notepad ++ est il capable de faire cela ?=


Merci
Patrice

1 réponse

Avatar
Olivier Miakinen
Le 03/12/2007 10:02, a écrit :

Je reprends des éléments de la discussion de jeudi : "Encodage
caractère : bizzareries". merci à tous ceux qui m'ont apportés leurs
connaissances.



Note que tu aurais pu répondre dans le même fil, ou alors corriger
« bizzarerie » et « bizarrerie » (mais la première solution était à
mon avis préférable malgré la coquille).

Question initiale : soit le code suivant

[...]
charset=ISO-8859-1" />
[...]
<p> C'est 15 &euro;</p>
[...]
Affichage
C'est 15 EURO (sigle de l'euro)

Même source mais on se place en ISO 8859-15
[...]
Affichage
C'est 15 (suivi d'un carré)



Ce n'était pas la question initiale.

Dans la question initiale, tu avais ceci dans le code :
C'est 15 ¤
C'est 15 &euros;
Cela t'affichait ceci en ISO-8859-1 :
C'est 15 ¤
C'est 15 ¤
Et cela en ISO-8859-15 :
C'est 15 (suivi d'un carré)
C'est 15 ¤

Ce comportement est normal, car ton code contient un octet valant 80 en
hexa, code de l'¤ en CP1252, et que ton navigateur croit bien faire en
interprétant ta déclaration de charset « ISO-8859-1 » comme si c'était
« Windows-1252 » ou « CP1252 ». Quand tu déclares ISO-8859-15, il sait
que cette supposition est fausse et affiche un carré vide qui signifie
« caractère inconnu ».

======================================================= >
Olivier tu as été très très clair mais cela ammène une autre question.



Je ne l'étais peut-être pas assez, du coup. ;-)

Je travaille sous windows XP.

En gros ce que tu m'annonce c'est que mon navigateur (que ce soit IE
ou Firefox d'ailleurs) cherchent eux mêmes ce qu'ils pourraient
afficher quand ils n'ont rien à afficher (cas du caractère 0x80).



En fait l'algo me semble être le suivant :
- si l'utilisateur a déclaré CP1252 ou ISO Latin1, on utilise CP1252
qui est un surensemble de l'autre ;
- sinon on utilise ce qui est déclaré.

Donc si je developpe un site et que je ne fais pas gaffe, je peux donc
croire que tout va bien alors qu'en fait "ça merdoie".

Question 1 :
Comment être sûr que mon Navigateur respecte bien le charset qu'il
trouve sur la page Web sans chercher à essayer d'optimiser ?



Assure-toi que la page web est correcte, auquel cas le navigateur ne
cherchera pas à rattraper les erreurs puisqu'il n'y en aura pas :
http://validator.w3.org/

Pendant que j'y suis, note que ta page ne sera jamais 100 % correcte
si tu essayes de faire passer du XHTML pour du "text/html".

Voir http://pgoiffon.free.fr/info/inet/html_ou_xhtml.php

Question 2 :
Puis je utiliser sous Windows un éditeur de texte qui me code dans le
charset voulu et non en CP1252 ? (Question subsidiaire par ce que
c'est mon éditeur préféré, notepad ++ est il capable de faire cela ?



En fait, il te suffit d'éviter de saisir les caractères en bleu ou en
jaune de <http://www.miakinen.net/vrac/charsets/?or=4> (ceux qui se
trouvent sur les lignes 80 et 90). Tous les autres sont bons.

Un autre moyen consiste à faire tes nouvelles pages en UTF-8 ou en
ISO-8859-15 si ton éditeur le permet (mais je ne suis pas compétent
pour te parler de ce que permet ou non Notepad++)