IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Caractères spéciaux


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 437
    Points : 109
    Points
    109
    Par défaut Caractères spéciaux
    Bonjour,

    Je liste des fichiers d'un dossier pour les afficher dans une page avec leur lien associé, le problème est que je me retrouve avec des liens comme celui-ci Standard dcompte.pptx.

    Comment faire pour supprimer les caractères spéciaux?

    Ci-joint mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
        $dir = 'documents/';
    	$files = array_slice(scandir($dir),2);
    	foreach($files as $file){
    		echo '<ul>';
    		echo '<li><a target="_blank" href="'.$dir.$file.'">'.$file.'</a></li>';
    		echo '</ul>';
    	}
    ?>
    Merci par avance.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Pour les autres qui consultent ce fil, la séquence est le résultat de ce forum qui a transformé le caractère U+FFFD


    Ce losange apparaît quand un caractère encodé dans un charset à 1 octet (par exemple latin-1) est interprété comme de l’UTF-8.

    La première solution est de déclarer correctement l’encodage de la page web, dans le header('Content-Type: ...') et / ou dans une balise <meta>. (Voir : Passez à l'UTF-8 sans manquer une étape.)

    La seconde solution est de convertir tous les caractères spéciaux en entités HTML. Cela se fait avec la fonction htmlentities. En l’occurence, il faudra traiter les variables $dir et $file.

    Comme troisième solution, il s’agit de traiter les fichiers au moment de l’upload / dépôt des fichiers sur le serveur, pour qu’ils n’aient pas de caractères spéciaux dans leurs noms.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 437
    Points : 109
    Points
    109
    Par défaut
    Dans ma page principale, j'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    , j'ai testé htmlentities mais ça ne fonctionne pas... Soit je n'a aucun retour soit tout les caratcères spéciaux sont supprimés...

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Montre-nous s’il te plaît :
    • le code PHP
    • le code généré dans ton navigateur avec Ctrl+U

    Merci
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  5. #5
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 437
    Points : 109
    Points
    109
    Par défaut
    Mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $nb_fichier="";
    if($dossier = opendir('documents/Standards/Standards indicateurs/')){
    	while(false !== ($fichier = readdir($dossier))){
    		if($fichier != '.' && $fichier != '..' && !preg_match('#\.(db)$#i', $fichier)){
    		echo '<div class="list-group">';
    		echo '<a target="_blank" href="documents/Standards/Standards indicateurs/'.$fichier.'" class="list-group-item">'.$fichier.'</a>';
    		echo '</div>';
    		$nb_fichier++;
    		}
    	}
    	echo '<br>';
    	if($nb_fichier>1){echo $nb_fichier." fichiers trouvés.";}else{echo $nb_fichiers." fichier trouvé.";}
    Résultat HTML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <div class="list-group"><a target="_blank" href="documents/Standards/Standards indicateurs/170630 Standard d�compte temps.pptx" class="list-group-item">170630 Standard d�compte temps.pptx</a></div><div class="list-group"><a target="_blank" href="documents/Standards/Standards indicateurs/170828 Standard d�compte temps.pptx" class="list-group-item">170828 Standard d�compte temps.pptx</a></div><div class="list-group"><a target="_blank" href="documents/Standards/Standards indicateurs/Seuils_Andon.pdf" class="list-group-item">Seuils_Andon.pdf</a></div><div class="list-group"><a target="_blank" href="documents/Standards/Standards indicateurs/Seuils_Andon.pptx" class="list-group-item">Seuils_Andon.pptx</a></div><div class="list-group"><a target="_blank" href="documents/Standards/Standards indicateurs/Standard DECOMPTE TEMPS.pdf" class="list-group-item">Standard DECOMPTE TEMPS.pdf</a></div><br>5 fichiers trouvés.
     
     
    	</div>

  6. #6
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 093
    Points : 6 754
    Points
    6 754
    Par défaut
    Où sont les appels à htmlentities ?

    Je t’ai peut-être induit en erreur avec mes histoires de <meta>. Je suis désolé. Pour être correct, j’aurais dû préciser que si les fonctions de système de fichier (scandir, readdir, etc.) n’envoient pas les caractères dans le bon encodage, alors on peut essayer tous les header et toutes les <meta> qu’on veut, ça ne règlera pas le problème.

    L’encodage utilisé par ces fonctions est défini par ce qu’on appelle la locale, que tu peux examiner en appelant setlocale(LC_ALL, 0); (il n’y a pas de fonction getlocale).

    Cet article nous apprend beaucoup de choses à ce sujet, notamment que :
    • si le serveur tourne sous Windows, on recevra probablement du windows-1252, qui est un encodage à 1 octet (où par exemple « é » est représenté par l’octet E9) ;
    • et si le serveur tourne sous Linux (ou assimilé), eh bien ça dépend de quel logiciel a créé le fichier, et on n’est pas vraiment avancés.


    Heureusement dans ton cas on sait que les noms de fichiers utilisent un encodage à 1 octet (grâce au losange). Je viens de vérifier, en effet htmlentities ne semble pas fonctionner avec ces caractères « spéciaux », il renvoie une chaîne vide. Cela doit nous mettre la puce à l’oreille : htmlentities dépend de l’encodage interne de PHP. C’est indiqué dans la doc :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    string $encoding = ini_get("default_charset")

    Je ne sais pas pour toi, mais moi dans mon phpinfo() j’ai default_charset = UTF-8, donc le problème vient bien de là.

    Pour faire fonctionner htmlentities, il suffit de lui passer un encodage explicite. Pour l’exemple je vais prendre windows-1252, mais si tu as des problèmes, essaye aussi iso-8859-1 (latin-1) ou iso-8859-15 (latin-9, qui gère le symbole « € »).

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var_dump(htmlentities(chr(0xE9)));
    var_dump(htmlentities(chr(0xE9), ENT_SUBSTITUTE));
    var_dump(htmlentities(chr(0xE9), ENT_COMPAT|ENT_HTML5, 'windows-1252'));
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  7. #7
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 437
    Points : 109
    Points
    109
    Par défaut
    Ok, c'est pour cela que je tourne en rond depuis 2 jours...

    Par contre lorsque je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ini_get("default_charset");
    j'obtiens UTF-8.

    J'ai regardé la documentation mais je dois avouer que je suis perdu... Je ne sais plus par quel bout prendre le problème...

  8. #8
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mai 2017
    Messages
    437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mai 2017
    Messages : 437
    Points : 109
    Points
    109
    Par défaut
    Ok, c'est bon pour moi, jje viens de comprendre qui fallait que j'intègre le ce code dans mon code...

    Un grand merci pour l'info, résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. caractères spéciaux
    Par mat10000 dans le forum Flash
    Réponses: 16
    Dernier message: 23/10/2003, 13h22
  2. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 17h54
  3. Transformation XSL et caractères spéciaux
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 4
    Dernier message: 28/04/2003, 10h38
  4. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 16h49
  5. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 09h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo