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

encodage mal programmé ?

20 réponses
Avatar
alainL
Bonjour,
Un quizz comprend trois fichiers: questions.php, liste données.txt,
corrige.php

une question contient un numero, l'adresse d'une image, son vrai nom, et
deux faux noms soit 5 données dans une ligne d'enregistrement (les 3
noms seront affichés ds un ordre différent ), lignes numérotées de 1 à
XX dans un fichier texte (facile à compléter)

le programme "question" va donc chercher une ligne d'enregistrement dans
un ordre aléatoire et affiche l'image et les trois propositions....

mais je me suis aperçu que les données contenant (sans doute) un
caractère accentué n'étaient pas affichées.
( http://autourdalos.fr/html/quizz1q.php?Fnm=fleurs_septembre.txt )

J'ai vérifié la correspondance des encodages, tant dans le fichier
question que dans le fichier txt (en 8859-1 avec notepad) mais je
n'obtiens rien. (pareil pour le corrigé ... et pour les autres mois)

Un coup de main serait le bienvenu !! Merci à l'avance

Alain
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Voici qqs morceaux du code de la page question.php
=================================================================
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" >
<title>Quizz fleurs (questions)</title>
...............................................................

# lecture fichier, sélection aléatoire de 10 lignes
$Fnm=$_GET['Fnm'];
$inF = fopen($Fnm,'r');

for ($i=1;$i<$nb;$i++) {
#Lire quelques caractères s'arrête avant s'il rencontre \n ou la fin du
fichier !
$ligne[$i] = fgets($inF, 4096);

$donneesligne=explode(';',$ligne[$i]);
$numligne[$i]=$donneesligne[0];
# si rencontre la ligne choisie , indice(1 à 10 ) les 4 données
# $imgligne[1] : image pour la 1ère question, $nvligne: bonne reponse,
$nf et $nff: mauvaises réponses
if ($numligne[$i]==$origine){
$imgligne1=$donneesligne[1];
$nvligne1=htmlspecialchars($donneesligne[2], ENT_QUOTES);
$nfligne1=htmlspecialchars($donneesligne[3], ENT_QUOTES);
$nffligne1=htmlspecialchars($donneesligne[4], ENT_QUOTES);
}
else if ($numligne[$i]==$origine+$ajout){
$imgligne2=$donneesligne[1];
$nvligne2=htmlspecialchars($donneesligne[2], ENT_QUOTES);
$nfligne2=htmlspecialchars($donneesligne[3], ENT_QUOTES);
$nffligne2=htmlspecialchars($donneesligne[4], ENT_QUOTES);
}
............................................

print ("<form name='form1' method='post' action='quizz1r.php'>
<fieldset><legend></legend>
<img src='$imgligne1' alt='' ><br>
<label for='r_01'>
<input id='r_01' type='radio' name='reponse1' value='$nfligne1' >
$nfligne1
</label>
<label for='r_02'>
<input id='r_02' type='radio' name='reponse1' value='$nvligne1' >
$nvligne1
</label>
<label for='r_03'>
<input id='r_03' type='radio' name='reponse1' value='$nffligne1' >
$nffligne1
</label>
<input type='hidden' name='bonnereponse1' value='$nvligne1' >
<input type='hidden' name='image1' value='$imgligne1' >
</fieldset>

================================================================

AlainL

10 réponses

1 2
Avatar
Eric Demeester
Bonjour,

Denis Beauregard (Mon, 01 Sep 2014 19:02:27 -0400 - fr.comp.lang.php) :

Pour le passage à UTF-8, l'idéal est de tout convertir avec
notepad++ comme suggéré.



Pour des raisons que je n'ai pas entièrement comprises (on avait tenté
de me m'expliquer à l'époque sans grand succès), dans Notepad++, il faut
choisir comme encodage : UTF-8 sans BOM, adapté aux sites web, et pas
UFT-8 tout court.

Un autre truc à savoir : le serveur et la copie locale ne sont
pas identiques pour ce qui est de la gestion des accents. En
d'autres mots, cela peut marcher comme il faut sur son ordi et
pas sur le serveur. Donc, relire toutes les pages.



Cette vérification est utile, mais une fois les problèmes d'encodage
résolus, tant dans l'affichage du site (je renouvelle au passage le
conseil de passer en HTML5/CSS3, plus à la page, plus simples que 4.x et
offrant plus de possibilités) que dans les fonctions PHP, ça devrait
rouler.
Avatar
Otomatic
Eric Demeester écrivait :

Pour des raisons que je n'ai pas entièrement comprises (on avait tenté
de me m'expliquer à l'époque sans grand succès), dans Notepad++, il faut
choisir comme encodage : UTF-8 sans BOM, adapté aux sites web, et pas
UFT-8 tout court.



Parce que cette entête BOM ajoute des caractères « parasites » sur une
ou plusieurs pages HTML (générées par PHP), comme “” ou, la
génération des pages donne une erreur du style Warning: Cannot modify
header information - headers already sent by …

Il y a une très grande probabilité pour qu'un ou plusieurs de vos
fichiers ait été sauvegardé avec une entête BOM, en anglais Byte Order
Mark, qui est - théoriquement - utilisée comme marqueur pour indiquer
que le texte est codé en UTF-8, UTF-16 ou UTF-32 et dans quel ordre sont
les octets d'un caractère UTF-16 ou UTF-32.

Pour UTF-16, le BOM est une séquence de deux octets FE FF au début de la
chaîne codée, pour indiquer que les caractères codés suivants utilisent
l'ordre poids fort en dernier (big-endian) ; ou FF FE pour indiquer
l'ordre poids faible en dernier (little-endian). Alors qu'UTF-8 n'a
aucun problème d'ordre des octets, un BOM codé en UTF-8 peut être mis
pour identifier un fichier comme UTF-8, mais ce n'est pas recommandé
puisque ce BOM ne sert à rien, l'ordre des octets étant fixe en UTF-8.

Si on utilise un éditeur de texte (ou autre logiciel éditeur
hexadécimal) qui permet de voir le fichier sous forme hexadécimale,
c'est à dire avec une suite d'octets qui en représente le contenu, on
peut voir si il y a des caractères supplémentaires (BOM) au début du
fichier.

Par exemple, en vue héxadécimale, le début d'un fichier.php normal est :

00000000 3C3F 7068 700D 0A2F 2A2A 2A2A 2A2A <?php..//******
0000000E 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************
0000001C 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************

Le même fichier avec entête BOM est :

00000000 EFBB BF3C 3F70 6870 0D0A 2F2A 2A2A <?php..//***
0000000E 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************
0000001C 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************

On voit bien que trois octets sont insérés au début du fichier : EF BB
BF, c'est l'entête BOM. La plupart du temps, ces trois octets sont vus
comme caractères : “” dans la fenêtre du navigateur ce qui permet de
déterminer qu'il s'agit bien d'une entête BOM.

Il faut toujours vérifier, lorsque l'on sauvegarde un fichier modifié,
que le logiciel donne une option “Sans BOM” ou que celle-ci fait partie
des Réglages ou Préférences du logiciel.

Lorsque l'on édite/modifie un fichier, bien faire attention aux options
ou préférences dudit logiciel :

Pas de transcodage automatique
Le fichier sauvegardé doit garder son codage d'origine, par exemple
pas de transcodage automatique ASCII -> UTF8
Pas d'ajout d'entête BOM si celle-ci n'existait pas

Faire aussi attention aux logiciels de téléchargement et de transfert de
fichiers (FTP) qui ne doivent, en aucune manière, modifier quoi que ce
soit.

Beaucoup de logiciels Windows (incluant Notepad) ajoutent un BOM aux
fichiers UTF-8 si on n'y prend pas garde. C'est pourquoi il est
recommandé d'utiliser Notepad++ (Gratuit :
http://notepad-plus.sourceforge.net/fr/site.htm) qui indique, en bas de
page, dans la barre d'état, diverses informations dont le codage du
fichier :

ANSI
ANSI as UTF-8 (C'est la version UTF-8 sans BOM)
UTF-8 (C'est la version UTF-8 avec BOM)
etc.

et qui permet, via le menu Encodage, de convertir d'un codage vers un
autre.

Ainsi, si on se retrouve, sans le vouloir, avec les caractères “”, il
suffit d'ouvrir, avec Notepad++ le fichier incriminé, de changer le
codage via le menu Encodage .
--
Ce n'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont forcément raison. Coluche
Avatar
Olivier Miakinen
Le 02/09/2014 11:13, Otomatic répondait à Éric Demeester :

Pour des raisons que je n'ai pas entièrement comprises (on avait tenté
de me m'expliquer à l'époque sans grand succès), dans Notepad++, il faut
choisir comme encodage : UTF-8 sans BOM, adapté aux sites web, et pas
UFT-8 tout court.





Je ne sais pas si cette nouvelle tentative d'explication sera ou non
couronnée de succès, d'autant que je vais ajouter mon grain de sel
aux explications très claires d'Otomatic...


Parce que cette entête BOM ajoute des caractères « parasites » sur une
ou plusieurs pages HTML (générées par PHP), comme “” ou, la
génération des pages donne une erreur du style Warning: Cannot modify
header information - headers already sent by …



Oui et oui. Je précise que ces caractères “” ne sont visibles sous
cette forme que si l'on lit le fichier comme si c'était du Latin-1 ou
équivalent. Ils sont invisibles si on le lit en tant qu'UTF-8, mais
néanmoins présents (et potentiellement nuisibles).


Il y a une très grande probabilité pour qu'un ou plusieurs de vos
fichiers ait été sauvegardé avec une entête BOM, en anglais Byte Order
Mark, qui est - théoriquement - utilisée comme marqueur pour indiquer
que le texte est codé en UTF-8, UTF-16 ou UTF-32 et dans quel ordre sont
les octets d'un caractère UTF-16 ou UTF-32.

Pour UTF-16, le BOM est une séquence de deux octets FE FF au début de la
chaîne codée, pour indiquer que les caractères codés suivants utilisent
l'ordre poids fort en dernier (big-endian) ; ou FF FE pour indiquer
l'ordre poids faible en dernier (little-endian). Alors qu'UTF-8 n'a
aucun problème d'ordre des octets, un BOM codé en UTF-8 peut être mis
pour identifier un fichier comme UTF-8, mais ce n'est pas recommandé
puisque ce BOM ne sert à rien, l'ordre des octets étant fixe en UTF-8.



J'ajoute que le BOM en UTF-8 est d'autant plus inutile que UTF-8 est
très facile à reconnaître : je n'ai entendu parler de confusion possible
que dans le cas d'un fichier en chinois de 4 octets.


Si on utilise un éditeur de texte (ou autre logiciel éditeur
hexadécimal) qui permet de voir le fichier sous forme hexadécimale,
c'est à dire avec une suite d'octets qui en représente le contenu, on
peut voir si il y a des caractères supplémentaires (BOM) au début du
fichier.

Par exemple, en vue héxadécimale, le début d'un fichier.php normal est :

00000000 3C3F 7068 700D 0A2F 2A2A 2A2A 2A2A <?php..//******
0000000E 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************
0000001C 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************

Le même fichier avec entête BOM est :

00000000 EFBB BF3C 3F70 6870 0D0A 2F2A 2A2A <?php..//***
0000000E 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************
0000001C 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A 2A2A **************

On voit bien que trois octets sont insérés au début du fichier : EF BB
BF, c'est l'entête BOM. La plupart du temps, ces trois octets sont vus
comme caractères : “” dans la fenêtre du navigateur ce qui permet de
déterminer qu'il s'agit bien d'une entête BOM.



Encore une fois, on ne verra ces caractères qu'en iso-8859-1, Win-1252
ou équivalent. Un BOM peut très bien passer inaperçu tout en étant
nuisible dans de nombreux cas.


Il faut toujours vérifier, lorsque l'on sauvegarde un fichier modifié,
que le logiciel donne une option “Sans BOM” ou que celle-ci fait partie
des Réglages ou Préférences du logiciel.

Lorsque l'on édite/modifie un fichier, bien faire attention aux options
ou préférences dudit logiciel :

Pas de transcodage automatique
Le fichier sauvegardé doit garder son codage d'origine, par exemple
pas de transcodage automatique ASCII -> UTF8
Pas d'ajout d'entête BOM si celle-ci n'existait pas

Faire aussi attention aux logiciels de téléchargement et de transfert de
fichiers (FTP) qui ne doivent, en aucune manière, modifier quoi que ce
soit.



Oui à tout (si ce n'est qu'un transcodage ASCII -> UTF-8 est une
opération qui ne fait rien, pourvu qu'il s'agisse d'UTF-8 simple, sans
BOM).


Beaucoup de logiciels Windows (incluant Notepad) ajoutent un BOM aux
fichiers UTF-8 si on n'y prend pas garde. C'est pourquoi il est
recommandé d'utiliser Notepad++ (Gratuit :
http://notepad-plus.sourceforge.net/fr/site.htm) qui indique, en bas de
page, dans la barre d'état, diverses informations dont le codage du
fichier :

ANSI
ANSI as UTF-8 (C'est la version UTF-8 sans BOM)
UTF-8 (C'est la version UTF-8 avec BOM)
etc.



Beurk ! « ANSI as UTF-8 » pour de l'UTF-8 sans BOM ? Qui a pu avoir
le cerveau assez dérangé pour inventer une telle dénomination ? Et
« UTF-8 » seulement pour la version avec BOM ? Tout est fait pour
tromper l'utilisateur, on dirait. :-(


et qui permet, via le menu Encodage, de convertir d'un codage vers un
autre.

Ainsi, si on se retrouve, sans le vouloir, avec les caractères “”, il
suffit d'ouvrir, avec Notepad++ le fichier incriminé, de changer le
codage via le menu Encodage .




Ok.

Cordialement,
--
Olivier Miakinen
Avatar
alainL
Parfait, ça marche !
Un grand merci et bonne journée.

AlainL

http://autourdalos.fr

Le 02/09/2014 10:17, Olivier Miakinen a écrit :
htmlspecialchars($donneesligne[...], ENT_QUOTES|ENT_SUBSTITUTE,
"ISO-8859-1");
Avatar
Otomatic
Olivier Miakinen <om+ écrivait :

> ANSI
> ANSI as UTF-8 (C'est la version UTF-8 sans BOM)
> UTF-8 (C'est la version UTF-8 avec BOM)
> etc.

Beurk ! « ANSI as UTF-8 » pour de l'UTF-8 sans BOM ? Qui a pu avoir
le cerveau assez dérangé pour inventer une telle dénomination ? Et
« UTF-8 » seulement pour la version avec BOM ? Tout est fait pour
tromper l'utilisateur, on dirait. :-(



J'avais demandé à ce que ce soit modifié pour éviter de « tromper »
l'utilisateur.
Maintenant, c'est :
- 'UTF-8 w/o BOM' pour UTF-8 sans BOM
- 'UTF-8' pour UTF-8 avec BOM
--
Ce n'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont forcément raison. Coluche
Avatar
Olivier Miakinen
Le 02/09/2014 14:48, Otomatic a écrit :

> ANSI as UTF-8 (C'est la version UTF-8 sans BOM)
> UTF-8 (C'est la version UTF-8 avec BOM)

[...] Tout est fait pour tromper l'utilisateur, on dirait. :-(



J'avais demandé à ce que ce soit modifié pour éviter de « tromper »
l'utilisateur.
Maintenant, c'est :
- 'UTF-8 w/o BOM' pour UTF-8 sans BOM
- 'UTF-8' pour UTF-8 avec BOM



Même si j'aurais préféré respectivement 'UTF-8 w/o BOM' et 'UTF-8
with BOM', voire 'UTF-8' et 'UTF-8 with BOM', c'est déjà beaucoup
mieux. Merci de l'avoir demandé... et obtenu !
Avatar
Denis Beauregard
Le Tue, 02 Sep 2014 14:48:52 +0200, Otomatic
écrivait dans fr.comp.lang.php:

Olivier Miakinen <om+ écrivait :

> ANSI
> ANSI as UTF-8 (C'est la version UTF-8 sans BOM)
> UTF-8 (C'est la version UTF-8 avec BOM)
> etc.

Beurk ! « ANSI as UTF-8 » pour de l'UTF-8 sans BOM ? Qui a pu avoir
le cerveau assez dérangé pour inventer une telle dénomination ? Et
« UTF-8 » seulement pour la version avec BOM ? Tout est fait pour
tromper l'utilisateur, on dirait. :-(



J'avais demandé à ce que ce soit modifié pour éviter de « tromper »
l'utilisateur.
Maintenant, c'est :
- 'UTF-8 w/o BOM' pour UTF-8 sans BOM
- 'UTF-8' pour UTF-8 avec BOM



J'ai la version française et je pense que j'ai toujours lu

Encoder en UTF-8 (sans BOM)

Je ne me rappelle pas avoir lu ANSI pour UTF-8 mais je n'utilise que
depuis 2 ou 3 ans.


Denis
Avatar
Otomatic
Denis Beauregard
écrivait :

Encoder en UTF-8 (sans BOM)

Je ne me rappelle pas avoir lu ANSI pour UTF-8 mais je n'utilise que
depuis 2 ou 3 ans.


Ce dont je « parlais », c'est ce qui est indiqué dans la ligne d'état,
pas des intitulés des options du menu de transcodage.
Avatar
Otomatic
Olivier Miakinen <om+ écrivait :

Même si j'aurais préféré respectivement 'UTF-8 w/o BOM' et 'UTF-8
with BOM', voire 'UTF-8' et 'UTF-8 with BOM', c'est déjà beaucoup
mieux. Merci de l'avoir demandé... et obtenu !


Et moi aussi !
Je préfère l'explicite à l'implicite(1). Mais, c'est mieux que rien.
Du coup, je viens de faire une demande similaire pour UltraEdit.

(1) En tant qu'ancien contrôleur qualité principal dans l'aéronautique,
je faisais appliquer :
Tout ce qui n'est pas explicitement autorisé est implicitement interdit.
--
Envoyé depuis mon Apple ][ Europlus et
Carte Appletell en réversible 1200/75
Avatar
Eric Demeester
Denis Beauregard (Tue, 02 Sep 2014 09:06:06 -0400 - fr.comp.lang.php) :

J'ai la version française et je pense que j'ai toujours lu
Encoder en UTF-8 (sans BOM)



C'est bien ça.

Je ne me rappelle pas avoir lu ANSI pour UTF-8 mais je n'utilise que
depuis 2 ou 3 ans.



Au delà de la réponse d'Automatic, il me semble qu'ANSI (dans le menu de
choix d'encodage) se rapporte à ce qu'on a choisi comme table dans
« Langues d'Europe occidentale », à savoir le plus communément
ISO-8859-1(5) ou cp1252 (Windows).

Quelqu'un pour confirmer ou infirmer cette interprétation pifométrique ?
1 2