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 :

Encodage de la chaine renvoyée par shell_exec [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Encodage de la chaine renvoyée par shell_exec
    Bonjour,

    Voici une "colle" qui me pourrit depuis une bonne journée :

    Je travaille sous windows Vista avec WampServer 2 et dans un script php, j'utilise la fonction native :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $DirContents = shell_exec("dir"); 
    echo "<br>\n ".nl2br($DirContents);
    pour récupérer et afficher sur Firefox une chaine contenant un résultat identique à l'instruction dir tapée sur l'invite de commande de dos.

    PB : je récupère pour certains caractères accentués un point d'interrogation dans un losange noir.

    Précision : mon script est encodé en UTF-8, j'utilise le module mb_string avec en directive dans mon php.in :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = UTF-8
    mbstring.http_output = UTF-8
    mbstring.encoding_translation = On
    Ce qui fait que ma config gère normalement bien l'encodage UTF-8. pour preuve, l'instruction :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "\n <br> Affichage d'une chaine complexe : Iñtërnâtiônàlizætiøn";
    echo "\n <br> un peu d'exotisme en sus : Tдtд";
    affiche bien :

    Affichage d'une chaine complexe : Iñtërnâtiônàlizætiøn
    un peu d'exotisme en sus : Tдtд

    d'où problème !! Mais me direz-vous, que se passe-t'il si j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<br>\n ".nl2br(utf8_encode($DirContents));
    Pas dur, certains de mes losanges sont alors remplacés par un y avec un tréma et d'autres caractères comme le é est remplacé par RIEN DU TOUT.

    J'ai bien essayé d'utiliser la fonction mb_convert_encoding du module mbstring mais sans succès.
    Je pense qu'il faut que je sache quel est l'encodage des chaines renvoyés par shell_exec non ?

    En tout cas, un grand merci à ceux qui me répondront car ce truc me rend dingue !!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 97
    Points : 119
    Points
    119
    Par défaut
    Solution caca, mais je ne connais pas de meilleur solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function fix_string($str) {
    	return strtr($str,
    		chr(130).chr(136).chr(138).chr(137).
    		chr(133).chr(131).chr(132).chr(140).
    		chr(139).chr(151).chr(150).chr(129).
    		chr(147).chr(148).chr(135).chr(255),
    		chr(233).chr(234).chr(232).chr(235).
    		chr(224).chr(226).chr(228).chr(238).
    		chr(239).chr(249).chr(251).chr(252).
    		chr(244).chr(246).chr(231).chr(32)
    	);
    }
    $DirContents = fix_string(shell_exec("dir"));
    trouvé dans les commentaire de shell_exec :
    http://www.php.net/manual/fr/functio...exec.php#79272


  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Lorsqu'on obtient des "losanges" (�) non désirés, c'est que des caractères ISO sont affichés en tant que caractères UTF-8

    Que donnent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_convert_encoding($DirContents, 'UTF-8', 'ISO');
    mb-convert-encoding.php


    et (avec iconv)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iconv("ISO-8859-1", "UTF-8", $DirContents)

    L'idéal serait d'identifier l'encodage de caractères utilisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_detect_encoding($DirContents);
    function.mb-detect-encoding

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Solution
    En fait, mb_detect_encoding ne détecte pas forcément l'encodage (du moins c'est que mes essais de la fonction montre), il faut savoir quel est l'encodage de la chaine qu'on récupère. En l'occurrence, quand je récupère une chaine issue de DOS avec l'instruction 'dir', elle est encodée en CP850 (code page 850) qui est un encodage propre à windows du moins pour l'invite de commande DOS.

    Quand on ne connait pas l'encodage d'une chaine récupérée (notamment par un prgm externe), la solution est donc au final :
    1/ utiliser la fonction mb_list_encodings() pour récupérer la liste de tous les encodages supportés ;
    2/ Afficher la chaine après l'avoir converti avec mb_convert_encoding :

    ChaineFinale =mb_convert_encoding($ChaineInitiale, "utf-8","ENCODAGEPOTENTIEL")

    jusqu'à ce qu'à trouver le bon encodage. Les deux liens suivants peuvent permettre de bien comprendre la question des encodages et leur liste :



    http://french.joelonsoftware.com/Articles/Unicode.html

    http://www.tuteurs.ens.fr/faq/utf8.html

  5. #5
    Invité
    Invité(e)
    Par défaut
    La solution que tu proposes a-t-elle fonctionné pour toi ?

    Le sujet m'intéresse, assez, si tu as des retours à faire sur ta solution je suis preneur.

    Si le sujet est résolu, merci de le passer en tant que tel

  6. #6
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Suite et fin
    Le problème est pour moi résolu. Le seul hic est que d'après mes recherches sur le sujet, il n'est pas possible de détecter à tous les coups proprement l'encodage d'une chaine. J'ai découvert que le bon encodage de la chaine renvoyé par la commande shell_exec uniquement après avoir visionné le résultat la fonction mb_convert_encoding appliqué à chacun des encodages recensés avec mb_list_encoding.
    La fonction mb_detect_encoding ne permet pas hélàs d'identifier l'encodage de la chaine renvoyé par shell_exec.
    Cela dit avec les liens que j'ai mis, toute personne rencontrant le pb et tombant sur cette dicussion devrait s'en sortir...

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

Discussions similaires

  1. chaine renvoyé par echo()
    Par theflash518 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 25/08/2010, 14h28
  2. [LG]résultat renvoyé par une fonction
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 10/12/2003, 10h31
  3. Sélectionner tous les id renvoyés par une 1ère requête
    Par Prof Vince dans le forum Requêtes
    Réponses: 5
    Dernier message: 29/11/2003, 19h46
  4. Réponses: 2
    Dernier message: 16/10/2003, 17h17
  5. Traitement d'un char* renvoyé par une DLL en C++
    Par LuluTchab dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2003, 21h48

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