problème d'accents avec READDIR

Eléphanteau du PHP | 25 Messages

02 nov. 2009, 02:17

bonjour,

J'utilise une fonction qui permet de lister les fichiers dans un dossier (combinaison opendir, readdir, closedir). OK, tout marche très bien sauf que si je fais un print_r de l'array qui sort de tout ca .. les caractères accentués ne sont pas affichés correctement.

- le server apache/mysql est Mamp pro (je tourne sous Mac OS X 10.6)
- il y a une balise meta dans la page avec l'iso-88-59-1 comme charset
- Evidemment si je change le charset oh miracle ca marche (je comprends pas pourquoi mais ca marche).
- je ne suis pas trop pour "convertir" tout en utf-8

j'ai essayé des combinaisons avec rawurlencode (ou decode), htmlentities ... mais rien n'y fait


est ce que l'un oul'une d'entre vous aurait deja été confronté à ce problème ?
est ce que cela vient du "systeme de fichier et d'encodage" utilisé sur mac ou cela peut venir d'ailleurs ?
(ps: j'ai pas encore tenté de faire des tests sur un autre server apache)

Bone journée,

F

ViPHP
ViPHP | 1136 Messages

02 nov. 2009, 08:57

Salut ,

Bon , tu as bien cerné le problème concernant l'encodage ,
maintenant reste à uniformiser le tout .

Edite : Oups , j'ai lu trop vite ... ton fichier est donc en =>iso-88-59-1 ( en es tu certains )
ton serveur lui est en quel charset par défaut ?

Si mb_string est installé , tu peux faire une série d'opération concernant l'encodage

Détecter l'encodage d'une chaine
http://fr2.php.net/manual/fr/function.m ... coding.php

Conversion d'encodage d'une chaine
http://fr2.php.net/manual/fr/function.m ... coding.php



Sinon, tu peux toujours utiliser htmlentities en spécifiant l'encodage re retour
htmlentities($str, ENT_QUOTES,"<ton encodage>")
Good luck ,
Ch.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 nov. 2009, 12:49

Bonjour,
j'ai essayé des combinaisons avec rawurlencode (ou decode), htmlentities ... mais rien n'y fait
Et avec utf8_encode / utf8_decode ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 25 Messages

02 nov. 2009, 20:03

Bonjour,
Déjà merci pour vos réponses.

- La page sur laquelle je travaille est en ISO-8859-1 (<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />)

- Le server apache/mysql, en faisant un phpinfo(), est en UTF-8 ... du moins c'est ce qui en ressort dans la section Apache Environement: HTTP_ACCEPT_CHARSET UTF-8,* et dans la partie HTTP header information: Accept-Charset UTF-8,* ... en admettant qu'il faille bien aller regarder dans cette section la pour connaitre le charset du server....

- La version de php est 5.2.6

La petite fonction opendir, readdir, closedir que j'utilise (équivalent à la fonction scandir sous php 5), génère un array avec la liste des fichiers (noms d'images dans ce cas là) d'un un dossier spécifié.

si je faits un "mb_detect_encoding" sur l'entrée du tableau qui correspond au fichier "image1.jpg" ca me dit ASCII
si je faits un "mb_detect_encoding" sur l'entrée du tableau qui correspond au fichier "image1 à la campagne .jpg" ca me dit UTF-8 ... alors dejà la je comprends pas

si je fais un mb_convert_encoding (sur l'entrée du tableau qui correspond au fichier images avec des accents dans le nom) ("auto" ----> utf-8 ou ASCII ----> utf-8) les accents sont remplacés par des ?

ps: j'obtiens le même genre de resultats avec utf8_decode et htmlentities en spécifiant le charset .....

la il y a un truc qui m'échappe mais je vois pas où ..... vous allez peu être me dire de coder mes pages avec un hearder en utf8 .. oui effectivement avec le header en utf-8 tout s'affiche correctement. Mais enfin, ca devrait être possible d'afficher correctement un nom de fichier avec des accents avec un header iso-8859-1 non ??????

Merci pour vôtre aide


F

chrego
Invité n'ayant pas de compte PHPfrance

14 nov. 2009, 22:10

Bonjour,

je viens de tomber pile poil sur le même problème aujourd'hui, et après avoir pas mal fouillé (y compris être tombé ici), ceci a fonctionné pour moi:

if ($handle = opendir($dir)) {
while (false !== ($file_raw = readdir($handle))) {
$file = iconv("utf-8", "iso-8859-1//IGNORE", $file_raw );
<reste du code de traitement, qui utilise $file>
}
}

La bizarrerie qui me reste c'est que quand je met ce code chez mon hébergeur, ça marche impeccable, alors que lorsque je le fais tourner sur mon PC avec EasyPHP, mes caractères accentués sont ignorés (à cause du //IGNORE), visiblement non reconnus comme des caractère UTF-8 à la lecture....