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
Denis Beauregard
Le Mon, 01 Sep 2014 09:32:30 +0200, alainL
écrivait dans fr.comp.lang.php:

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 )




Mon serveur impose l'UTF-8 même si le fichier est en iso. Le problème
est peut-être là et non dans le code.


Denis
Avatar
Eric Demeester
Bonjour,

alainL (Mon, 01 Sep 2014 09:32:30 +0200 - fr.comp.lang.php) :

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)



Au delà de la possibilité évoquée par Denis, je te suggère d'utiliser
plutôt Notepad++, beaucoup mieux adapté à la gestion des encodages
(ainsi qu'à l'écriture de scripts PHP, entre autres) que le Notepad de
Windows :
http://notepad-plus-plus.org/fr/

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" >



Menu Encodage -> Encoder en ANSI (ou convertir en ANSI)
Menu Édition -> Convertir les sauts de ligne -> Convertir en format UNIX
(si ton serveur est sous UNIX, cas le plus fréquent).

Vois si ça résoud ton problème, ou si ça te permet de mieux le
comprendre.
Avatar
Eric Demeester
Eric Demeester (Mon, 01 Sep 2014 10:58:01 +0200 - fr.comp.lang.php) :

Menu Encodage -> Encoder en ANSI (ou convertir en ANSI)



En complément, dans le même menu :
Codage de caractères -> Langues d'Europe occidentale -> ISO-7859-1

Tu devrais songer à travailler plutôt en UFT-8, voire adopter aussi
HTML5, mais nous sortons du cadre du PHP.
Avatar
Olivier Miakinen
Bonjour,

Le 01/09/2014 09:32, alainL a écrit :

[...] 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 )



En effet, certaines chaînes sont vides.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Voici qqs morceaux du code de la page question.php
================================================================


Voyons les fonctions que tu appelles.

$inF = fopen($Fnm,'r');



http://fr2.php.net/manual/fr/function.fopen.php
Je ne vois pas de problème particulier avec le charset.

$ligne[$i] = fgets($inF, 4096);



http://fr2.php.net/manual/fr/function.fgets.php
Idem.

$donneesligne=explode(';',$ligne[$i]);



http://fr2.php.net/manual/fr/function.explode.php
Idem.

$nvligne1=htmlspecialchars($donneesligne[2], ENT_QUOTES);



http://fr2.php.net/manual/fr/function.htmlspecialchars.php

Là par contre il y a plein de trucs à propos de l'encodage et des
caractères invalides ! En particulier...

1) un paramètre $encoding qui vaut par défaut ini_get("default_charset")
et non "iso-8859-1" : sais-tu quelle est sa valeur ?

2) le fait que la valeur de retour sera une chaîne vide si la chaîne
d'entrée est une séquence de code invalide, à moins que tu n'aies
mis l'un des drapeaux ENT_IGNORE (déconseillé) ou ENT_SUBSTITUTE
(qui mettra U+FFFD à la place).


Et donc, comme souvent : RTFM ! ;-)

Cordialement,
--
Olivier Miakinen
Avatar
alainL
Merci.

Je viens de modifier le charset du fichier question et d'enregistrer la
liste avec notepad++ en précisant encodage utf-8...

la liste apparait, après le choix d'utf-8, avec des caractères
particuliers mais c'est peut-être normal...

Par contre, les deux fichiers transférés sur la site distant, le
problème persiste, certaines données sont ignorées... (testé sous Ffx ou
Chrome)

http://autourdalos.fr/html/quizz1qutf.php?Fnm=fleurs_septembreutf.txt

AlainL


Le 01/09/2014 11:39, Eric Demeester a écrit :
Eric Demeester (Mon, 01 Sep 2014 10:58:01 +0200 - fr.comp.lang.php) :

Menu Encodage -> Encoder en ANSI (ou convertir en ANSI)



En complément, dans le même menu :
Codage de caractères -> Langues d'Europe occidentale -> ISO-7859-1

Tu devrais songer à travailler plutôt en UFT-8, voire adopter aussi
HTML5, mais nous sortons du cadre du PHP.

Avatar
Olivier Miakinen
Le 01/09/2014 13:00, alainL a écrit :

Je viens de modifier le charset du fichier question et d'enregistrer la
liste avec notepad++ en précisant encodage utf-8...

la liste apparait, après le choix d'utf-8, avec des caractères
particuliers mais c'est peut-être normal...



C'est normal si ton encodage par défaut ini_get("default_charset") vaut
UTF-8 : la fonction htmlspecialchars dont je t'ai encouragé à lire la
doc laisse passer les caractères puisque maintenant ils sont valides,
mais le navigateur les décode mal puisqu'on lui a dit que c'était du
Latin-1.

Par contre, les deux fichiers transférés sur la site distant, le
problème persiste, certaines données sont ignorées... (testé sous Ffx ou
Chrome)

http://autourdalos.fr/html/quizz1qutf.php?Fnm=fleurs_septembreutf.txt



Cf. la doc, tu dois préciser à la fonction htmlspecialchars quel est
l'encodage de ce dont tu lui demandes de traiter les 'special chars'.
Pour te faciliter la vie, tu peux aussi mettre l'option ENT_SUBSTITUTE,
ce qui te permettra de voir au moins les caractères ASCII.

P.-S.: Tant que tu y es, je te suggère de passer *tout* à UTF-8 :
- le contenu du fichier .txt
- le paramètre de htmlspecialchars
- le meta http-equiv de la page
- l'entête Content-Type envoyé par ton serveur Apache (ceci, quand tu
auras traduit toutes tes pages en UTF-8)

Cordialement,
--
Olivier Miakinen
Avatar
Olivier Miakinen
Le 01/09/2014 15:24, je répondais à alainL :

la liste apparait, après le choix d'utf-8, avec des caractères
particuliers mais c'est peut-être normal...



C'est normal si ton encodage par défaut ini_get("default_charset") vaut
UTF-8



C'est un peu plus compliqué que ça, comme je viens de m'en rendre
compte en lisant un peu plus complètement la doc :
<http://fr2.php.net/manual/fr/function.htmlspecialchars.php>.

L'encodage par défaut est :
- "ISO-8859-1" avant PHP 5.4
- "UTF-8" en PHP 5.4 et PHP 5.5
- ini_get("default_charset") à partir de PHP 5.6

En outre, si l'on en croit une note d'utilisateur vieille de trois
ans, le paramètre $encoding est sensible à la casse !


Bref, à utiliser avec précautions...
Avatar
alainL
Je patauge !
j'ai donc :
- le fichier.txt en UTF-8 (avec notepad++)AlainL
- DOC type html 4.01 et charset=UTF-8

- j'ai essayé d'utiliser l'exemple de la doc et modifié une série de
récup de données avec ça :
=============================================================== string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT |
ENT_HTML401 | ENT_QUOTES [, string $encoding = UTF-8]] )

if ($numligne[$i]==$origine){
$imgligne1=$donneesligne[1];
$nvligne1=htmlspecialchars($donneesligne[2]);
$nfligne1=htmlspecialchars($donneesligne[3]);
$nffligne1=htmlspecialchars($donneesligne[4]);
}
.............
===========================================
Mauvaise syntaxe sans doute, le résultat est une page blanche, je n'ai
même plus l'image !


http://autourdalos.fr

Le 01/09/2014 16:13, Olivier Miakinen a écrit :
Le 01/09/2014 15:24, je répondais à alainL :

la liste apparait, après le choix d'utf-8, avec des caractères
particuliers mais c'est peut-être normal...



C'est normal si ton encodage par défaut ini_get("default_charset") vaut
UTF-8



C'est un peu plus compliqué que ça, comme je viens de m'en rendre
compte en lisant un peu plus complètement la doc :
<http://fr2.php.net/manual/fr/function.htmlspecialchars.php>.

L'encodage par défaut est :
- "ISO-8859-1" avant PHP 5.4
- "UTF-8" en PHP 5.4 et PHP 5.5
- ini_get("default_charset") à partir de PHP 5.6

En outre, si l'on en croit une note d'utilisateur vieille de trois
ans, le paramètre $encoding est sensible à la casse !


Bref, à utiliser avec précautions...

Avatar
Denis Beauregard
Le Mon, 01 Sep 2014 15:24:40 +0200, Olivier Miakinen
<om+ écrivait dans fr.comp.lang.php:

- l'entête Content-Type envoyé par ton serveur Apache (ceci, quand tu
auras traduit toutes tes pages en UTF-8)



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

Je me rappelle qu'il y avait un test pour vérifier si tous les
caractères de type 0x80 à 0xFF sont précédés ou suivis d'un autre
du même groupe ou pas. Si c'est isolé, ce n'est pas du UTF-8.

Ce doit être dans les archives de ce groupe Usenet.

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.


Denis
Avatar
Olivier Miakinen
Le 01/09/2014 23:10, alainL a écrit :
Je patauge !



Bon, reprenons calmement.

Tu as gardé une sauvegarde de ton script initial (encodé en iso-8859-1)
avec le fichier de questions lui-même en iso-8859-1 ?

Reprends tout ça, en remplaçant simplement les :
htmlspecialchars($donneesligne[...], ENT_QUOTES);
par :
htmlspecialchars($donneesligne[...], ENT_QUOTES|ENT_SUBSTITUTE,
"ISO-8859-1");

Puis reviens nous voir.


P.-S. : Je suis désolé, je pensais que t'envoyer vers la lecture de la
doc de la fonction htmlspecialchars suffirait à t'éclairer.
Rappel : <http://fr2.php.net/manual/fr/function.htmlspecialchars.php>

Cordialement,
--
Olivier Miakinen
1 2