Encodage => nom de dossier windows dans page HTML en utf8

Eléphant du PHP | 229 Messages

08 janv. 2013, 11:35

Bonjour,

Je reçoit des nom de dossier par l'utilisation de la fonction scandir().
Le nom de dossier je le transforme en lien cliquable pour utiliser la fonction scandir() (si c'est un dossier et le télécharger si c'est une fichier).

Le problème : quand le nom de dossier comporte un caractère spéciale j'ai un message d’erreur du serveur php du genre scandisc() impossible car "fichier introuvable" après avoir cliqué dessus.

J'utilise de l'utf-8 a réception du dossier pour bien que le nom soit affiché dans ma page en utf-8. Quand je teste le nom a reception avec la fonction mb_detect_encoding() je crois que c'est de l'ansi ou acssi.

Je vous donne le code ou le site ? ou les 2 ?

D'avance merci.

Synthèse du blème :
1- je récupère le nom de dossier (qui contient un é)
2- je l'affiche en utf8. L'affichage est OK donc je clique pour la suite du traitement.
3- je l'envoi par un $_POST[] (input hidden) vers une autre page et là le nom n'est plus reconnu et donc je ne peut plus poursuivre le script.

ps : Bien sur tout roule avec des noms de dossier sans caractères spéciaux. J'ai donc tout enlevé les é. Mais j'aimerais bien trouver la fonction qui résoudra mon problème.

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 12:29

Ton autre page elle est en quoi ? utf-8 aussi ?

Eléphant du PHP | 229 Messages

08 janv. 2013, 12:54

Merci de m'aider,
<meta charset="utf-8">
Dans le head

Eléphant du PHP | 229 Messages

08 janv. 2013, 13:04

Le message quand je clique sur se lien là :

Image

( ! ) Warning: scandir(courscnam/NFA007-Méthodes pour l'informatisation/,courscnam/NFA007-Méthodes pour l'informatisation/) [function.scandir]: Le fichier sp�cifi� est introuvable. (code: 2) in D:\wamp\www\predev\functions.php on line 5

Eléphant du PHP | 229 Messages

08 janv. 2013, 13:09

Mais quand je clique sur :

Image


ba ca marche :

Image


Voila ma fonction :
(on se moque pas hein)
function parcour($dir)
{
$var=scandir($dir);
	foreach($var as $elem)
	{
			if(is_dir($dir.$elem)==true)
			{
				if( $elem == '.' or $elem == '..' )continue;
	?>
				
					
				<form action="traitement_list.php" method="post">
					
					<input type="hidden" value="<?php echo utf8_encode($dir).utf8_encode($elem);?>" name="dossier"/>
				<pre>-><input type='submit' class="btn btn-link" value="<?php echo utf8_encode($elem); ?>" name="submit"/></pre>
				</form>
			
			
	<?php
			}

			if(is_file($dir.$elem)==true)
			{
	?>

			<p><a href="<?php echo $dir.$elem; ?>" target="_blank"><?php echo utf8_encode($elem); ?></a></p>
			
	<?php
			}

	}
}


?>

ViPHP
xTG
ViPHP | 7331 Messages

08 janv. 2013, 14:42

Tentes de passer une chaîne en iso à scandir, il n'apprécie peut être pas l'utf-8.
Il faut savoir qu'il y a bon nombre de fonction du PHP qui malgré toutes les configurations qu'on peut effectuer resteront en iso.

M'enfin, c'est pas le genre de problème qu'on a l'habitude de gérer, vu qu'on ne nomme au grand jamais des fichiers ou dossiers avec des caractères spéciaux ou accentués. ;)

Eléphant du PHP | 229 Messages

10 janv. 2013, 08:29

Slt,

J'&ai ajouté cela en debut de code :
$var=scandir($dir);
	foreach($var as $elem)
	{
		$elem=utf8_decode($elem);
		$elem=iconv("UTF-8", "ISO-8859-1//TRANSLIT", $elem);
de façon a travailler en iso mais rien n'y change le fichier reste introuvable.

Et apache me réponde sans relache :
( ! ) Warning: scandir(NFA006-Structures de donnees/,NFA006-Structures de donnees/) [function.scandir]: Le fichier sp�cifi� est introuvable. (code: 2) in D:\wamp\www\predev\functions.php on line 5
Call Stack
# Time Memory Function Location
1 0.0002 373696 {main}( ) ..\traitement_list.php:0
2 0.0006 389912 parcour( ) ..\traitement_list.php:96
3 0.0006 389944 scandir ( ) ..\functions.php:5
ou
Notice: iconv() [function.iconv]: Detected an illegal character in input string in D:\wamp\www\predev\functions.php on line 9
Call Stack
si j'enleve la ligne utf8_encode


voila si ca peut aider les encodage recensé :

Image

ViPHP
xTG
ViPHP | 7331 Messages

10 janv. 2013, 09:35

Euh... Tu as une virgule dans ton nom de dossier ? :shock:
C'est chercher à aller en enfer ton tintouin...

Ne serais-t-il pas plus simple de renommer correctement ton SI ?
Et au pire d'utiliser une table de correspondance (nom <=> nom réel de fichier) dans ta base de données si tu cherches à afficher des noms de ce type.
C'est ce que tout développeur fait sans même y penser dans des cas comme le tien.

Eléphant du PHP | 229 Messages

10 janv. 2013, 13:48

Je vais faire ça.
Ca me permettait de faire un uplaod sans trop de contrainte pour l’utilisateur (moi en l’occurrence).

Je vais travailler avec les expressions rationnelles et/ou une table d'équivalence aussi pourquoi pas. L'occasion est bonne non ?

Peut être faire ça : FILTER_VALIDATE_REGEXP au moment de l'upload pour choisir le nom du dossier sauvegardé.

CA m'embete quand même de pas trouver de solution au niveau traduction de l'encodage lui-même.
JE vais me replonger dans les bouquins...