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 Perl Discussion :

wide caracter (printed)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut wide caracter (printed)
    Bonjour à tous,

    Je récupère dans un fichier .xml, des données scientifiques (textes) contenant des caractères tel que ", des lettres grecques, des exposants dans des formules. Pour ce fichier unique d'entrée, j'ai plusieurs fichiers textes de sortie. J'obtiens le message 'Wide character in print at ...', mais je ne sais pas pour quels fichiers de sortie, et l'écriture en fichier texte se fait correctement si je l'ouvre avec Notepad, mais pas si j'ouvre ce fichier avec excel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	open (my $fh_out,  ">", $file_out)  or die "cannot create file : $!";
     
    	print $fh_out "Submission\t$Biostudies_ID\tPublic\n";
    	print $fh_out "Title\t$s_data{'Title'}\n";
    	print $fh_out "RootPath\t$s_data{'RootPath'}\n";
    	print $fh_out "AttachTo\tdiXa\n\n";
    	print $fh_out "Study\n";
    	print $fh_out "Project\t$s_data{'Project'}\n";
    	print $fh_out "Source Id\t$s_data{'Source Id'}\n";
    	print $fh_out "Title\t$s_data{'Title'}\n";
    	print $fh_out "Description\t$s_data{'Description'}\n";
    L'erreur vient de la description (la dernière ligne), j'aimerais récupérer le $Biostudies_ID correspondant (premier print).

    Je ne sais pas si cela est important, mais j'utilise le module XML::Simple.

    Sur Wikipédia, il est dit 'A wide character is a computer character datatype that generally has a size greater than the traditional 8-bit character. '... mais, je ne sais pas que faire pour y remédier.

    J'aimerais donc avoir votre aide pour :
    1) avoir le $Biostudies_ID dans le message d'erreur du premier programme qui traite le fichier xml.
    2) que les fichiers textes de sortie puissent être lu ultérieurement sans faire tout planter (ce qui se passe si j'essaie de le lire avec un programme Python).


    D'avance merci pour votre aide,

    Jasmine.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonjour,

    Sans chercher à plus comprendre ton programme, la piste sérieuse à creuser est l'encodage de tes fichiers (surement en UTF-8). Il faut prendre l'habitude de lire tes fichiers en utilisant le réel encodage. Cela évitera ce genre d'erreurs, que ce soit à l'ouverture d'un fichier avec open ou avec un module XML::Simple ou XML::Twig.

  3. #3
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par djibril Voir le message
    Bonjour,

    Sans chercher à plus comprendre ton programme, la piste sérieuse à creuser est l'encodage de tes fichiers (surement en UTF-8). Il faut prendre l'habitude de lire tes fichiers en utilisant le réel encodage. Cela évitera ce genre d'erreurs, que ce soit à l'ouverture d'un fichier avec open ou avec un module XML::Simple ou XML::Twig.
    Hello Djibril, Merci pour le conseil.

    Et si c'est un fichier qui me vient d'une autre personne, à qui je ne peux pas le demander ... comment puis-je connaitre l'encodage ?

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    À la lecture de ton fichier source xml encodé en UTF8, XML::Simple le décode silencieusement en unicode. Si ton fichier comprend un caractère en dehors de la plage ASCII comme par exemple la lettre PI (GREEK CAPITAL LETTER PI), celui-ci sera représenté par CE A0 (en UTF8) dans ton fichier, mais une fois transformé par XML::Simple, il deviendra 03 A0 (en unicode).

    Tu peux imposer que tout ce que tu transmets aux flux sortants (tes fichiers en écriture) soit au préalable automatiquement encodé en UTF8 en ajoutant le pragma:use open OUT => ':utf8'; au début de ton script. Sinon tu peux le faire pour chaque fichier en l'ouvrant de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (my $fh_out,  ">:utf8", $file_out)  or die "cannot create file : $!";
    Si tu veux juste afficher le contenu d'une variable sans erreur tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Encode::Encoder;
    ...
    print Encode::encode('UTF-8', $s_data{'Description'});
    Pour ce qui est de $Biostudies_ID dans la mesure où je ne sais pas d'où sort cette variable, je ne peux pas trop t'aider. (Peut-être que "Biostudies_ID" est une clef du hash $s_data comme les autres.)

  5. #5
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Un très grand merci CosmoKnani, comme toujour c'est très clair et très complet !

    Citation Envoyé par CosmoKnacki Voir le message
    Pour ce qui est de $Biostudies_ID dans la mesure où je ne sais pas d'où sort cette variable, je ne peux pas trop t'aider.
    En fait, je voudrais que quand le script à cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $fh_out "Title\t$s_data{'Title'}\n";
    rencontre un problème, dans le message d'erreur de sortie, il y soit indiqué la valeur de $Biostudies_ID (string indépendant du hash) à ce moment-là ... ou le nom du fichier de sortie ... quelque chose, qui me permette de savoir quels fichiers de sortie rencontrent ce problème.

    Là, j'ai en sortie 188 fichiers, 188 $Biostudies_ID différents, j'ai 20 fois le même message de mise en garde au sujet de l'encodage ... mais rien qui ne me dise pour quels fichiers. (et j'aime pas trop les devinettes ^^)

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Tu peux imposer que tout ce que tu transmets aux flux sortants (tes fichiers en écriture) soit au préalable automatiquement encodé en UTF8 en ajoutant le pragma:use open OUT => ':utf8'; au début de ton script. Sinon tu peux le faire pour chaque fichier en l'ouvrant de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (my $fh_out,  ">:utf8", $file_out)  or die "cannot create file : $!";
    Si tu veux juste afficher le contenu d'une variable sans erreur tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use Encode::Encoder;
    ...
    print Encode::encode('UTF-8', $s_data{'Description'});
    En tout cas, plus aucun message d'erreur ! Par contre, si j'ouvre le fichier texte, qui avant avait précédemment les caractères correctes, ils sont maintenante erronés ! C'est à ne plus rien comprendre. Mon signe - est devenu â ... si ça peut aider à comprendre, apparemment les lettres grecques sont restées correctes. (Il vallait encore mieux comme avant, avec des warring perl, mais des fichiers de sortie avec les bons caractères ... mais les 2, seraient l'idéal, pas d'erreur et de bons fichiers de sortie !)

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Attention à ne pas confondre UTF-8 et UTF8.

    Si tel est l'encodage de tes fichiers, tu dois les lire en UTF-8 ET écrire en UTF-8. Sous Windows, tu peux le savoir via l'éditeur de texte notepad++. Sous Linux, il y a la commande file

  8. #8
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Un tutoriel sur le sujet: http://perl.developpez.com/tutoriels...ge-caracteres/

    Bonne soirée.

  9. #9
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Merci à vous deux,

    De mon côté, j'ai trouvé ceci : https://quentinc.net/chenc
    un petit utilitaire tout simple en ligne de commande pour windows servant à déterminer l'encodage de caractères utilisé par un fichier et de le changer si besoin
    Bonne fin de semaine,

    Jasmine.

  10. #10
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Bonjour à tous,


    Citation Envoyé par djibril Voir le message
    Si tel est l'encodage de tes fichiers, tu dois les lire en UTF-8 ET écrire en UTF-8.
    Oui, c'est bien de l'UTF-8 ... d'après NotePad. Merci pour le tuyau.

    Je n'arrive pas à spécifier à XML::Simple, que c'est de l'UTF-8 ... pourriez-vous m'aider ?
    Voici la doc

    Pour le fichier d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my $xml = new XML::Simple;
    my $ref_data = $xml->XMLin($file);
     
    my $ref_data_utf8 = Encode::encode('UTF-8',$ref_data);
    my %data = %{$ref_data_utf8};
    erreur :
    Can't use string ("HASH(0x2dbd9a8)") as a HASH ref while "strict refs" in use at diXa_XML_Simple_DIXAD_create_files.pl line 24.
    La ligne 24, c'est la dernière.

    Pour la sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open (my $fh_out,  ">:utf8", $file_out)  or die "cannot create file : $!";
    ... donc UTF8 est différent de UTF-8 ... mais je ne peux pas ajouter un tiret, sinon le code plante. Comment puis-je faire ?

    Cela est-il dangereux de changer l'encodage de mon fichier d'entrée ?

    Merci beaucoup.


    NB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $fh_out Encode::encode('UTF-8', $s_data{'Description'});
    ... ne fonctionne pas.

  11. #11
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    À tout hasard, quelle est l'encodage précisé dans la directive XML de ton fichier source? Toujours dans ton fichier source, les lettres grecques sont-elles écrites telles quelles ou représentées par une entité? Même question pour le tiret qui pose problème.

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

Discussions similaires

  1. message d'erreur 'Wide character in print'
    Par Jasmine80 dans le forum Langage
    Réponses: 15
    Dernier message: 15/12/2015, 17h17
  2. Problème de Wide character et de print :(
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 11/03/2006, 18h02
  3. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 15h44
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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