[Perl] Comment décoder du UTF8 si pas de module sur le serveur ?

Comment décoder du UTF8 si pas de module sur le serveur ? [Perl] - Perl - Programmation

Marsh Posté le 04-04-2004 à 02:45:37    

Bonjour,  
 
J'utilise l'API Google et je me sers de la fonction "moteur de recherche".  
Il s'agit d'un script permettant d'interroger la base de données de Google de façon transparente.
 
J'ai développé un script, en perl pour utiliser cet API. Le programme fonctionne bien, mais tout s'affiche en UTF8 en fait, c'est à dire que tous mes caractères avec des accent sont encodés.  
 
Cela est normal en fait : cela vient de l'API google et ça je le sais mais comment résoudre ce problème ?  
 
En PHP il y a le module utf8_decode qui sert à corriger le tir mais là je suis en perl..je sais qu'il existe un module Unicode::MapUTF8 mais il n'est pas installé sur mon serveur.  
 
J'ai bien trouvé un module nommé UTF8.pm mais je ne sais pas comment l'utiliser. J'ai trouvé dans la doc perl des instructions, mais la commande uf8:: decode fait planter mon programme et pourtant j'ai fait un copier/coller de la doc perl officielle...
 
note : j'ai mis un espace dans uf8 :: decode entre le : et le d ici car sinon le forum prend ça pour un smilley....
 
Auriez-vous une idée ?  
 
Merci d'avance !  
 
Merci !


Message édité par Ethan_carter le 04-04-2004 à 02:49:14
Reply

Marsh Posté le 04-04-2004 à 02:45:37   

Reply

Marsh Posté le 04-04-2004 à 14:18:23    

Quelle version de Perl utilise tu?

Reply

Marsh Posté le 04-04-2004 à 23:43:20    

Salut Pospos,
 
Je suis content que tu me répondes, s'il y en a bien un qui soit capable de déméler les cas les plus complexes, c'est bien toi !
 
J'utilise (je est un grand mot, c'est mon hébergeur qui installe tout) Perl version 5.6.1
 
voici les infos données par pg-serveur.pl de perl-gratuit.com (petit programme trés pratique d'ailleurs)
 
Interpréteur Perl
-----------------------------------------
 
Version de Perl utilisée ici:  5.006001  
 
  /usr/bin/perl existe ?  OUI : This is perl, v5.6.1 built for i386-linux  
 
  /usr/local/bin/perl existe ?  NON  
 
 
Est-ce que tu as une idée sur ce que je peux faire ?
J'ai essayé de faire des substitutions avec s/// mais ça ne fait rien du tout.
 
Je précise qu'en mettant :
 

Code :
  1. print "content-type:text/html; charset=UTF-8\n\n";


 
la page s'affiche à peu prés correctement, mais cela dépend du navigateur utilisé je suppose. Il reste encore des problèmes, notamment pour tous les champs récupérés avec param(), qui sont encodés.
 
Merci d'avance !


Message édité par Ethan_carter le 04-04-2004 à 23:48:53
Reply

Marsh Posté le 04-04-2004 à 23:47:27    

Je copie ici mon script (celui qui utilise l'api google)
L'API google est GoogleSearch.wsdl et je précise que le $encoding ne sert à rien...
 
Google génère tout en UTF-8, quel que soit la valeur de $encoding.
 
$userkey, c'est ma clé personnelle, masquée ici bien entendu.
 

Code :
  1. use SOAP::Lite;
  2. $wsdl="${PATH_system}GoogleSearch.wsdl";
  3. $googleSearch = SOAP::Lite -> service("file:$wsdl" );
  4. if ($step == 0) {$cursor=0}
  5. else {$cursor = 10*$step}
  6. $userkey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  7. $encoding="latin1";
  8. $result= $googleSearch -> doGoogleSearch($userkey,$qsnt, $cursor, 10, "true"
  9. , "", "false", "lang_fr", "$encoding", "$encoding" );
  10. $data=$result->{'resultElements'};
  11. $total = $result->{'estimatedTotalResultsCount'};
  12. for(my $i=0;$i<10;$i++) {
  13. $curdata=$$data[$i];
  14. $url=$curdata->{URL};
  15. $title=$curdata->{title};
  16. $snippet=$curdata->{snippet};
  17. $chercher .=qq~
  18. <li><b><u> $title </u></b> <br>
  19. <font size=-2><i>$snippet</i></font><br>
  20. <font size=-2>&nbsp;&nbsp; -&gt; <A href="$url" target="_blank">$url</A></font>
  21. <br><br><br>~;

 
 
encore merci.

Reply

Marsh Posté le 04-04-2004 à 23:53:09    

je rajoute encore un élément :
 
pg-serveur.pl me dit que le module UFT8 est bien installé : chargement OK
 
en revanche, le module UTF8 :: decode ne semble pas présent.
 

Code :
  1. Test du module Perl : utf8::decode
  2. Ce module n'est pas présent (ou très éventuellement mal installé).
  3. Message d'erreur retourné :
  4. Can't locate utf8/decode.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl/5.6.0/i386-linux /usr/lib/perl5/site_perl/5.6.0 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at (eval 1) line 2.
  5. BEGIN failed--compilation aborted at (eval 1) line 2.


 
merci
 
 

Reply

Marsh Posté le 05-04-2004 à 00:12:29    

Oula tu risque d'etre décu pasque l'utf8 c'est pas ma tasse de thé!
 
c'est koi ton histoire de s///, je comprends pas trop ?
 
Pour utiliser l'utf8 dans perl 5.6 il faut utiliser le pragama utf8 ("use utf8", avec une portée lexicale), mais ca n'est plus le cas avec perl 5.8 (d'ailleurs il faudra que tu retrouve le POD de la version 5.6 de ce pragma car il a un autre usage dans perl 5.8 il me semble)
 
Sinon essai le module Unicode::MapUTF8, il a l'air plus efficace pour tes conversion
 
Et pourkoi tu n'utilise pas le module Net::Google plutot que tout faire à la main avec SOAP::Lite?
 
dans la doc de Net::Google:

Citation :


According to the Google API docs :
 
 "In order to support searching documents in multiple languages  
 and character encodings the Google Web APIs perform all requests  
 and responses in the UTF-8 encoding. The parameters <ie> and  
 <oe> are required in client requests but their values are ignored.
 Clients should encode all request data in UTF-8 and should expect
 results to be in UTF-8."
(This package takes care of setting both parameters in requests.)

Reply

Marsh Posté le 05-04-2004 à 00:13:58    

ha ouai t'es chez un hebergeur donc si t'as pas Unicode::MapUTF8 ou Net::Google c'est chiant...

Reply

Marsh Posté le 05-04-2004 à 00:40:27    

pospos a écrit :


c'est koi ton histoire de s///, je comprends pas trop ?


 
j'avais essayé un truc du genre $texte =~ s/%C3%A9/é/g sans succés.
 
 

Citation :

Pour utiliser l'utf8 dans perl 5.6 il faut utiliser le pragama utf8 ("use utf8", avec une portée lexicale), mais ca n'est plus le cas avec perl 5.8 (d'ailleurs il faudra que tu retrouve le POD de la version 5.6 de ce pragma car il a un autre usage dans perl 5.8 il me semble)


 
 
Peut-on se servir de ce module pour convertir de l'UTF-8 ?
 
Sinon, aucune idée pour résoudre mon problème ?
 
Merci encore
Nico


Message édité par Ethan_carter le 05-04-2004 à 00:41:18
Reply

Marsh Posté le 05-04-2004 à 09:29:43    

Normalement la commande en dessous devrait te suffire

Code :
  1. $string=~ tr/\0-\x{ff}//UC;


Sinon tu peux utiliser le Unicode::String

Code :
  1. $u= Unicode::String::utf8; # $utf8 est une chaîne UTF-8
  2. latin1= $u->latin1;


Voir même pourquoi pas utiliser le XML::parser

Reply

Marsh Posté le 05-04-2004 à 10:29:47    

ben ouai Unicode::MapUTF8 ou d'autres mdoules dans le genre comme Unicode::String doivent te permettre de faire la conversion. Mais bon si ils sont pas installés...
(merde j'avais pas vu que tu parlais de Unicode::MapUTF8 dans ton premier message...)
 
le pragma utf8 fait normalement partie integrante de la distrib officielle de Perl 5.6.1
mais utf8::decode n'est pas un module mais une fonction du pragma utf8 (le tout en minuscules)
Mais le mieux c'est de passer pas Encode::Encoder pour ca.
Normalement il fait partie du core (enfin dans perl 5.8 en tous cas...)
donc essai ca:

Code :
  1. use Encode::Encoder "encoder";
  2. print encoder($texte_en_utf8)->latin1;


 
Et sinon pourkoi tu utilise pas Net::Google?

Reply

Marsh Posté le 05-04-2004 à 10:29:47   

Reply

Marsh Posté le 05-04-2004 à 11:56:40    

Salut,
 bah décidément...
 
le module net::google n'est pas non plus installé sur le serveur... pas plus que encode::encoder.
 
La réaction de mon hébergeur Globalwebco.net est d'ailleurs trés "commerciale" :
 

Citation :

"Ce que nous pensons en général, c'est que nous n'aimons jamais installer des choses dont un seul client a besoin à cause des besoins d'un logiciel spécifique. Cela nous fait travailler, et cela peut toujours comporter des risques car toute installation comporte des risques (elle peut mal se passer, se faire avec des fichiers corrompus, etc.) et nous évitons cela à tous prix. En général, nous disons aux clients que si un logiciel donné ne fonctionne pas bien ou n'est pas bien programmé ou a des exigences spécifiques auxquelles nous ne pouvons ou ne voulons pas répondre, il appartient aux clients de rechercher un logiciel capable de fonctionner comme il faut, pour ne pas risquer le sort de tous les gens qui sont sur un serveur donné, sinon, nous faisons payer le client car il s'agit de répondre à ses besoins spécifiques. Nous sommes convaincus qu'avec un peu de recherche, vous trouveriez des scripts capables de répondre à votre besoin en toute transparence, sans avoir besoin de nous faire installer ce module sur le serveur ou de payer des frais pour que nous puissions l'installer pour répondre à votre besoin particulier. Google lui-même devrait offrir, nous supposons, des strcutures d'appui capables de vous aider en utilisant leurs propres logiciels, je crois, ou alors vous pourriez reprogrammer votre logiciel pour une interprétation plus efficace du code de l'API de Google."


 
 
En revanche, un ami me dit que je peux installer moi-même des modules en utilisant Lib
 
comme indiqué ici :
http://www.geekuprising.com/how_ca [...] stall_them
 
Est-ce que cela est fiable ?


Message édité par Ethan_carter le 05-04-2004 à 12:00:59
Reply

Marsh Posté le 05-04-2004 à 12:26:10    

mais ça marche pas ça:

Code :
  1. $string=~ tr/\0-\x{ff}//UC;


??

Reply

Marsh Posté le 05-04-2004 à 15:45:54    

Ethan_carter a écrit :


 
En revanche, un ami me dit que je peux installer moi-même
des modules en utilisant Lib
 
comme indiqué ici :
http://www.geekuprising.com/how_ca [...] stall_them
 
Est-ce que cela est fiable ?


 
Oui je l'utilise tous les jours.
 
Pour installer un module où tu veux :
 
au moment du perl Makefile.pl faut utiliser PREFIX et LIB
 

Code :
  1. perl Makefile.PL PREFIX=/home/sniper/prod/mylibs LIB=/home/sniper/prod/mylibs
  2. make
  3. make test
  4. make install


 
pour utiliser les modules installés de cette manière, tu
peux gérer ça au cas par cas dans les scripts avec  
 

Code :
  1. use lib '/home/sniper/prod/mylibs';


 
ou positionner la variable d'environnment PERL5LIB
et tous les scripts sauront que des modules se trouvent
ds /home/sniper/prod/mylibs
 

Code :
  1. export PERL5LIB=/home/sniper/prod/mylibs


 
++
 
--  
David "Sniper" Rigaudiere
Les mongueurs de Perl -- http://www.mongueurs.net
Les journées de Perl 2004 -- http://conferences.mongueurs.net/2004/


Message édité par drigaudiere le 05-04-2004 à 15:47:09
Reply

Marsh Posté le 19-04-2004 à 01:59:57    

$string=~ tr/\0-\x{ff}//UC;  
 
fait planter perl.

Reply

Marsh Posté le 19-04-2004 à 02:02:58    

Merci pour vos réponses, mais mon hébergeur a fini par accepter d'installer le module Unicode::MapUTF8.
 
Sinon, pour infos, avec un  
 
$string = pack('C*', unpack('U*', $string));
(pour les cases du formulaire)
 
et un
 
print "content-type:text/html; charset=UTF-8\n\n";
(pour le reste)
 
je m'en sortais à peu prés sans le module.
 
Encore merci pour tout.

Reply

Sujets relatifs:

Leave a Replay

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