OVH Cloud OVH Cloud

virgule en l'air, Perl en galère...

16 réponses
Avatar
Paul
Bonjour =E0 tous...

Si je vous dis que j'ai un autre probl=E8me, vous me croyez ? :-)

Bon, cette fois ci, cela concerne Perl et xml.
En fait, parfois j'ai des fichiers xml qui contiennent le caract=E8re
', (un genre d'apostrophe, ou plut=F4t : une virgule en haut) mais le
parseur XML de Perl (XML::Simple) n'accepte pas du tout cela et fait
"tout planter".

Sachant que ces contenus xml sont des fils RSS et que je n'ai donc pas
la possibilit=E9 de les g=E9rer, comment dois-je m'y prendre pour =E9viter
ce probl=E8me ?

Merci =E0 tous.

6 réponses

1 2
Avatar
Paul
syswrite : ben après je fais un autre xml issu du premier...

notez que j'utilise pas de librairie pour écrire mes fichiers xml...
je fais un simple :
open (FichierLocal, ">>:utf8", $file);
Avatar
Paul Gaborit
À (at) 1 Dec 2005 09:37:56 -0800,
"Paul" écrivait (wrote):
syswrite : ben après je fais un autre xml issu du premier...

notez que j'utilise pas de librairie pour écrire mes fichiers xml...
je fais un simple :
open (FichierLocal, ">>:utf8", $file);


Si le fichier résultat contient un "Wide character", c'est que vous
l'avez écrit... Le bug doit se manifester à ce moment-là (lors de
l'écriture) et non lors de la lecture.

Il n'est pas très difficile de tracer le contenu du texte écrit
lorsque le bug se manifeste (*) et d'essayer de comprendre d'ou vient
ce contenu...

Ce que je ne comprends pas, c'est pourquoi les parseurs XML crie avec
le fichier RSS fourni alors que les convertisseurs iso-8859-1<->utf-8
ne disent rien...

(*) Par exemple en plaçant cela au début du script :

use Carp qw/confess/;
SIG{__DIE__} = sub {confess @_};

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul
J'ai donc mis ces deux lignes au début de mon script,
et j'ai simplement ajouté un $ devant SIG... :-)

use Carp qw/confess/;
SIG{__DIE__} = sub {confess @_};



Il ne reste plus qu'a attendre qu'un flux rss me pose probleme. je vous
tiens au courant... car ca peut durer un bon moment. :-)

En attendant, je vais aller me renseigner sur ce "confess", car j'avoue
l'avoir betement ajouté dans mon script sans savoir ce qu'il
faisait...

Avatar
Paul
Voilà, l'erreur est arrivée. et donc, je comprends vraiment l'interet
de Carp qw/confess/; !!!

voici ce qui s'affiche maintenant, et ca aide...
Wide character in syswrite at /usr/share/perl/5.8/Net/Cmd.pm line 436.
at ic5.pl line 12
main::__ANON__('Wide character in syswrite at
/usr/share/perl/5.8/Net/Cmd.pm ...') called at
/usr/share/perl/5.8/Net/Cmd.pm line 436
Net::Cmd::datasend('undef', '<H1>g&eacute;n&eacute;r&eacute;
par ...') called at /usr/share/perl5/MIME/Lite.pm line 2722
MIME::Lite::SMTP::print('MIME::Lite::SMTP=GLOB(0xd79722c)',
'<H1>g&eacute;n&eacute;r&eacute; par ...') called at
/usr/share/perl5/MIME/Lite.pm line 2159
MIME::Lite::print_simple_body('MIME::Lite=HASH(0xd7bbb14)',
'MIME::Lite::SMTP=GLOB(0xd79722c)') called at
/usr/share/perl5/MIME/Lite.pm line 2115
MIME::Lite::print_body('MIME::Lite=HASH(0xd7bbb14)',
'MIME::Lite::SMTP=GLOB(0xd79722c)') called at
/usr/share/perl5/MIME/Lite.pm line 2035
MIME::Lite::print('MIME::Lite=HASH(0xd7bbb14)',
'MIME::Lite::SMTP=GLOB(0xd79722c)') called at
/usr/share/perl5/MIME/Lite.pm line 2100
MIME::Lite::print_body('MIME::Lite=HASH(0x8cb264c)',
'MIME::Lite::SMTP=GLOB(0xd79722c)') called at
/usr/share/perl5/MIME/Lite.pm line 2058
MIME::Lite::print_for_smtp('MIME::Lite=HASH(0x8cb264c)',
'MIME::Lite::SMTP=GLOB(0xd79722c)') called at
/usr/share/perl5/MIME/Lite.pm line 2635
MIME::Lite::send_by_smtp('MIME::Lite=HASH(0x8cb264c)',
'smtp.free.fr', 'Timeout', 60) called at /usr/share/perl5/MIME/Lite.pm
line 2454
MIME::Lite::send('MIME::Lite=HASH(0x8cb264c)', 'smtp',
'smtp.free.fr', 'Timeout', 60) called at user.pm line 315
eval {...} called at user.pm line 315
user::sendReport('user=HASH(0xd881838)', 'HASH(0x88227c8)')
called at ic5.pl line 183

Donc, si je comprends bien, c'est lors de l'envoie par mail qu'il
n'aime pas ma "virgule en l'air"...
Avatar
Paul Gaborit
À (at) 3 Dec 2005 07:33:17 -0800,
"Paul" écrivait (wrote):
Voilà, l'erreur est arrivée. et donc, je comprends vraiment l'interet
de Carp qw/confess/; !!!

voici ce qui s'affiche maintenant, et ca aide...
Wide character in syswrite at /usr/share/perl/5.8/Net/Cmd.pm line 436.
at ic5.pl line 12
main::__ANON__('Wide character in syswrite at
/usr/share/perl/5.8/Net/Cmd.pm ...') called at
/usr/share/perl/5.8/Net/Cmd.pm line 436
Net::Cmd::datasend('undef', '<H1>g&eacute;n&eacute;r&eacute;
par ...') called at /usr/share/perl5/MIME/Lite.pm line 2722
[...]

MIME::Lite::send('MIME::Lite=HASH(0x8cb264c)', 'smtp',
'smtp.free.fr', 'Timeout', 60) called at user.pm line 315
eval {...} called at user.pm line 315
user::sendReport('user=HASH(0xd881838)', 'HASH(0x88227c8)')
called at ic5.pl line 183


'confess' permet effectivement d'afficher la pile compléte des appels
de fonctions. C'est assez pratique. ;-)

Donc, si je comprends bien, c'est lors de l'envoie par mail qu'il
n'aime pas ma "virgule en l'air"...


Ce qu'il faudrait comprendre, c'est d'où vient le contenu de ce mail
qui devrait être en utf-8 et qui contient (au moins) un caractère
illégal.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul
Ce qu'il faudrait comprendre, c'est d'où vient le contenu de ce mail
qui devrait être en utf-8 et qui contient (au moins) un caractère
illégal.


Certains fleurtent souvent dans l'illégalité.... j'espere ne pas en
faire partie... :-)

pour résumer :
1. je prends le fil RSS exmple :
http://www.internetactu.net/?feed=rss2
2. je récupère le titre
3. je créé un fichier local au format xml avec une entete utf-8 et
le fichier est créé en vrai utf-8 ; le parseur xml::simple récupère
bien le titre (qui contient le caractère illégal), et j'arrive à
écrire correctement le fichier local.
4. j'envoie (je tente d'envoyer) le mail avec un contenu extrait
depuis les eléments du fichier xml : je récupère chaque titres et
chaque description que j'avais auparavant écrite dans cet xml local.
5. c'est là que ca coince, MIME::Lite n'aime pas le caractere
"illégal" :-)

Bon, j'espere que je vais finir par m'en sortir avec ce pztit soucis...
c'est vraiment un truc pas tres cool quand meme...

Merci à tous ceux qui m'aident. :-)

1 2