variable accentuée, url, utf-8 ET listing de dossiers

Eléphanteau du PHP | 25 Messages

17 avr. 2010, 17:38

Bonjour tous,

Depuis 2 soirées je m'énerve violemment avec une "variable accentuée" passée dans une url. Toutes mes pages sont encodées en utf-8 (balise meta). Je m'explique (désolé c'est un chouille long, par avance merci de me lire):

Je suis en train de faire un petit script de gestion d'albums photos. L'architecture est la suivante:

dossier "toto et stéphane" : album d'images 1
dossier "tata": album d'images 2
dossier admin: fichier de gestions du (des) galeries d'images

Dossiers des albums photos ( ./nom du dossier/index.php)
Il y a lien vers "../admin/index.php" où est renseignée dans l'url le nom du dossier contenant l'album photos:

Voici comment je récupère le nom do dossier (dans tous les fichiers index.php des dossiers des albums photos):
// Gallery dir name
	$a = $_SERVER['PHP_SELF'];
	$t = ereg_replace("/index.php", "", $a);
	$dir = ereg_replace("/(.)*/","",$t);
 
Et voici le lien qui pointe vers le fichier index.php d'administration des albums photos
 <a href="../admin/index.php?dir=<? echo urlencode($dir); ?>" title="Administration panel" target="_blank" class="small_links">Admin</a></td>
 
Fichier ../admin/index.php:
Au click sur le lien précédent ça me donne ça (pour l'album photos "toto et stéphane"): http://localhost:8888/phpmm_full/admin/ ... t+stéphane

Alors voila mon problème:

Pour la suite des opérations, j'ai besoin de savoir quel album photos est "envoyé" (récupération de la variable $dir) au fichier ../admin/index.php, pour cela j'ai fait une fonction qui liste les noms des dossiers du répertoire ou sont enregistrés les albums photos:
function scan_galls($dirgall)
{
	 $files = array();
	 $fh = opendir($dirgall);
	 while (false !== ($filename = readdir($fh)) )
	 {
	 if ( $filename != "." and $filename != ".." and !is_file($filename) and $filename !== "admin" and !preg_match ("/^\./", $filename) )
	 {
	
	 array_push($files, $filename);}
	 
	 }
	 closedir($fh);
	 natcasesort($files); 
	 return $files;
 }	 

$galls=scan_galls("..");
 
LE PROBLEME:
$a = $galls['1'];
echo $a
Ca affiche "toto et stéphane"
$b = stripslashes($dir);
echo $b
Ca affiche "toto et stéphane"

if ($a == $b) echo "victoire";

.... et pas de victoire :-( ----> this is the problem

Voici ma configuration:
- Server apache/php (5.2.11)/mysql: NAMP (je suis sur Mac)
- Toutes mes pages sont encodées en utf-8 (balise META):

Code : Tout sélectionner

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Jj'ai essayé avec utf8_encode ou decode ... jamais je ne suis arrivé à victoire ...


l'un ou l'une d'entre vous aurait il une piste ?

Par avance merci et n'hésitez pas à me demandez d'autre détails si nécessaire

Par avance merci,

F

ViPHP
AB
ViPHP | 5818 Messages

17 avr. 2010, 20:18

1/ Pour envoyer un texte accentué via l'url tu peux utiliser urlencode puis urldecode ou rawurlencode puis rawurldecode

2/ Attention quand tu codes en utf-8 les entêtes apaches envoyées par défaut sont pour l'instant en iso et elle prennent le pas sur le charset indiqué dans les balises meta html. Il faut souvent donc mettre en haut de ton code php
header('Content-Type: text/html; charset=UTF-8');
Il y a un tuto ici

3/ ereg... etc. est déprécié en php5.3, à la place utilises preg...

Eléphanteau du PHP | 25 Messages

18 avr. 2010, 00:33

Merci pour tes réponses, tout juste pour Ereg, je avais pas vu.
Malheureusement meme en rajoutant le Header('Content-Type: text/html; charset=UTF-8'); tout en haut de mes pages php (qui comportent toutes les deux une balise meta avec le charset uft-8), ca ne fonctionne toujours pas :-(

je ne comprends absolument pas pourquoi lorsque je compare le nom du répertoire (qui est envoyé via une url) avec celui que je récupère via une fonction (en parcourant un dossier) .. impossible d'avoir un résultat de comparaision (==) positif ....

c'est assez énervant ... une idée ?

F

ViPHP
AB
ViPHP | 5818 Messages

19 avr. 2010, 03:28

De toutes façons faut pas mettre de caractères accentués ou spéciaux dans un nom de répertoire ou un nom de fichier.

Et comme je te l'ai déjà dit si tu veux faire passer des caractères accentués ou spéciaux dans une variable d'url


<?php
$var = 'é"(.=)à';
$var = rawurlencode($var);
?>
<a href = "mapage.php?var=<?php echo $var?>" >lien</a>
puis récupération
$var = isset($_GET['var'])? rawurldecode($_GET['var']) : '';

devlop78
Invité n'ayant pas de compte PHPfrance

19 avr. 2010, 10:35

Mais pourquoi déjà tu ne commencerais pas par déboguer ton truc... faire des petits strlen() pour déjà voir si tes valeurs sont en iso ou en utf8, etc ... peut-être qu'une conversion iso->utf8 ou inverse avant envoi ou après récupération pourrait t'aider ... même si chez moi un "é" de lien sur une page UTF-8 est transmise par GET en utf-8, je la récupère donc en utf-8 ... par contre si j'essaie d'ouvrir un fichier avec ça va poser problème (j'ai wamp et je suis sous windows, et j'ai fait le test, il n'accepte pas utf8). Après, configuration apache/php pour ce genre de situation, je ne sais pas du tout. A priori, sous Windows, le système fonctionne en AINSI, j'imagine qu'il faut aller chercher les fichiers locaux en AINSI (iso-8859-1 en gros ..) ...

Eléphanteau du PHP | 25 Messages

22 avr. 2010, 23:01

Bonjour,
Merci pour vos réponses. La récupération de la variable (accentuée) n'est pas un problème. Faire un echo dessus (via un rawurldecode) me l'affiche correctement dans le navigateur. Mon souci est que lorsque je veux comparer cette variable avec le nom du dossier (que je récupère via ma fonction scan_gall) que 'ca déconne' grave.

Je suis d'accord avec les noms de dossiers sans accents, c'est une bonne règle et je devrais l'appliquer.
le truc c'est que je ne comprend vraiment pas pourquoi ça ne marche pas!!!

j'ai fait des tests avec strlen et là, ca ne marche pas non plus:

echo strlen(trim(stripslashes($dir))) cela me donne une valeur de .... 17 (alors que je compte 16 caractères, espaces inclus)
$dir est la variable transmise via le lien (dans mon exemple: toto et stéphane)

echo strlen(trim($galls['1'])) cela me donne une valeur de ... 18
$galls['1'] est le nom du répertoire auquel je veux comparer le nom du dossier ($dir). Cette variable est issu d'une fonction de listing de dossiers (cf mon premier post)

ps: je rappelle que si je fais un echo des deux variables... cela m'affiche exactement la même valeur

Enfin, j'ai même essayé en rajoutant header('Content-Type: text/html; charset=UTF-8'); sur toutes mes pages ... idem

est ce que cela pourrait venir de la configuration de apache ou de php avec les jeux de caractères ?


Merci pour vos réponses,

F

ViPHP
AB
ViPHP | 5818 Messages

23 avr. 2010, 04:08

Je suis d'accord avec les noms de dossiers sans accents, c'est une bonne règle et je devrais l'appliquer.
le truc c'est que je ne comprend vraiment pas pourquoi ça ne marche pas!!!
ça marche pas parce que les noms de fichiers ou de dossiers avec des caractères accentués ou caractères spéciaux ne sont pas valides... maintenant si tu veux continuer absolumemnt à utiliser des caractères invalides pour des noms de fichiers ou de dossiers, ou à faire du code qui ne marche pas, ne cherches pas trop à comprendre pourquoi ça ne marche pas :roll:

Eléphanteau du PHP | 25 Messages

25 avr. 2010, 11:58

c'est exactement pour comprendre ce qui ne marche pas que je viens ici ...

Mammouth du PHP | 661 Messages

25 avr. 2010, 13:42

les caractères accentués sur la plupart des serveur ne sont pas correctement pris en compte il cherche à mettre des "%20" à la place des espace et autre ... mais ne les retrouve pas dans le nom des fichiers ... donc ça ne peux pas marcher !..