Ouvrir une commande en UTF-8 [RÉSOLU]

Ouvrir une commande en UTF-8 [RÉSOLU] - Perl - Programmation

Marsh Posté le 21-08-2008 à 17:43:11    

Bonjour,
 
J'essaye de lancer une commande, tout en récupérant le résultat pour une exploitation ultérieure...
 
Voici ce que ça donne en très simple :
 

Code :
  1. my $com = $_[0];
  2. open COM, "$com|";
  3. my @lines = <COM>;
  4. close COM;


 
Le problème est que le résultat de la commande contient des caractères unicode... Je voudrais donc récupérer le contenu au bon format...
 
Pour lire un fichier, il suffit de faire :
 

Code :
  1. my $file = $_[0];
  2. open IN, "<:utf8", "$file";
  3. my @lines = <IN>;
  4. close IN;


 
Mais on ne peut pas le faire pour une commande, j'ai essayé ces deux variantes :
 

Code :
  1. open COM, ":utf8", "$com|";
  2. open COM, "<:utf8", "$com|";


 
mais sans succès...
 
Quelqu'un sait comment résoudre mon problème ?
 
Merci d'avance... :hello:

Message cité 1 fois
Message édité par Predicator le 22-08-2008 à 13:41:42
Reply

Marsh Posté le 21-08-2008 à 17:43:11   

Reply

Marsh Posté le 22-08-2008 à 10:08:36    

use encoding et regarde aussi du coté de l'option -C de perlrun.


Message édité par anapajari le 22-08-2008 à 10:08:44

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 22-08-2008 à 13:39:14    

Le use encoding n'a eu aucun effet, et d'après ce que j'ai lu, ça joue sur l'encodage du script,et non l'encodage du retour de la commande.
 
Cependant, j'ai réussi à avoir un résultat à peu près potable, mais avec un point que je ne comprends pas.
 
Primo, j'ai mis mon script en UTF-8 (il était en LATIN1).
Secundo, j'ai mis le binmode de la commande en utf8 :
 

Code :
  1. my $com = "df -h";
  2. open COM, "$com|";
  3. binmode COM, ":utf8" or print "Erreur : $!";
  4. my @lines = <COM>;
  5. close COM;


 
Enfin, je joue sur la sortie CGI pour avoir le bon encoding dans le fichier HTML :
 

Code :
  1. my $cgi = new CGI;
  2. print $cgi->header('Content-type: text/html; charset=utf-8');
  3. print "<html>";
  4. print "<head>";
  5. print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
  6. print "</head>";
  7. print "<body>";
  8. ...


 
Alors les 2 lignes indiquant le charset sont obligatoires. Avec une seule ça ne marche pas.
J'ai beau avoir des notions de Perl, je ne connais pas du tout l'utilisation de perl en CGI, donc je n'ai pas d'explication à donner. Je suis preneur de toute explication, histoire de me coucher moins con...
 
Merci pour ta réponse en tout cas :)

Message cité 1 fois
Message édité par Predicator le 22-08-2008 à 13:41:28
Reply

Marsh Posté le 22-08-2008 à 14:05:10    

Predicator a écrit :

Le use encoding n'a eu aucun effet, et d'après ce que j'ai lu, ça joue sur l'encodage du script,et non l'encodage du retour de la commande.


Tout à fait, mais j'avais pas super bien compris le contexte. Tu noteras d'ailleurs que je te parlais de perlrun avec -C (qui lui règle STDIN/OUT) alors que tu te sers de perl en cgi.

Predicator a écrit :

Alors les 2 lignes indiquant le charset sont obligatoires. Avec une seule ça ne marche pas. J'ai beau avoir des notions de Perl, je ne connais pas du tout l'utilisation de perl en CGI, donc je n'ai pas d'explication à donner. Je suis preneur de toute explication


Ton pb ne venait pas du perl mais de l'affichage dans le navigateur.  
Par défault ( il me semble que) cgi/perl encode en latin1, et afficher de l'utf8 en latin donne un résultat... pas terrible.
Quoi qu'il en soit tout mettre dans le même encoding est une très bonne solution,  une autre étant de se servir de Encode par exemple.
 


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 22-08-2008 à 14:21:36    

Le manque d'explication que j'ai, c'est sur pourquoi les deux lignes sont obligatoires, alors qu'elles font à priori la même chose...
 
D'ailleurs, j'ai eu un effet de bord assez marrant. En écrivant n'importe quel texte avant le code HTML dans la sortie, l'affichage était correct, même sans les deux lignes...
 
Y'a des choses masquées quand même :)

Reply

Marsh Posté le 22-08-2008 à 19:50:59    

Predicator a écrit :

Bonjour,
 
J'essaye de lancer une commande, tout en récupérant le résultat pour une exploitation ultérieure...
 
Voici ce que ça donne en très simple :
 

Code :
  1. my $com = $_[0];
  2. open COM, "$com|";
  3. my @lines = <COM>;
  4. close COM;


 
Le problème est que le résultat de la commande contient des caractères unicode... Je voudrais donc récupérer le contenu au bon format...

Il me semble qu'il faut faire ce genre de chose:

Code :
  1. my $com = $_[0];
  2. use open ':utf8'; # ou bien  use open IN => ':utf8';
  3. open COM, "$com|";
  4. my @lines = <COM>;
  5. close COM;
  6. #et la tu peux remettre open a la precedente valeur d'encodage si tu le veux.


 
A+,


Message édité par gilou le 22-08-2008 à 20:41:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed