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

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    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.
    -- Jasmine --

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : avril 2004
    Messages : 19 799
    Points : 499 036
    Points
    499 036
    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
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 456
    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 456
    Points : 5 431
    Points
    5 431
    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.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    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 ^^)
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    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 ?
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    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 !)
    -- Jasmine --

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : avril 2004
    Messages : 19 799
    Points : 499 036
    Points
    499 036
    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
    Points : 12 465
    Points
    12 465
    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 émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    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.
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    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.
    -- Jasmine --

  11. #11
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    mars 2009
    Messages
    2 456
    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 456
    Points : 5 431
    Points
    5 431
    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.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    À 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.
    Merci pour ton aide, là je cogite en vain depuis ce matin ...

    J'ai besoin de fichiers de sortie en utf-8.
    J'ai utilisé le pragma use utf8;
    J'ai ouvert avec : open (my $fh_out, ">:utf8", $file_out)
    XML:Simple reconnait apparemment l'encodage tout seul (d'après ce que j'ai lu)

    Il n'y a aucun encodage spécifié au début du fchier XML, la personne qui l'a créé n'est plus là (elle travaillait avec java, si ça peut aider) ... et NorePad le reconnait comme du UTF-8.

    Alors, je ne comprends pas ... même mon script perl est lui-même en UTF-8 ... tout est en UTF-8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    '  (apostrophe)
    fichier xml : #226;€™
    fichier de sortie en utf8 : â
     
    - (tiret)
    fichier xml : –
    fichier de sortie en utf8 : â
    Encore merci.
    -- Jasmine --

  13. #13
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Avec open (my $fh_out, ">:utf8", $file_out) ... je n'ai plus le warning de Perl (Wide character in print), mais j'ai des erreurs dans mes fichiers de sortie.
    Avec use utf8, j'ai les messages de mise en garde, mais je n'ai actuellement encore rien trouvé comme erreurs dans mes fichiers, ça semblent beaucoup mieux.
    -- Jasmine --

  14. #14
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : avril 2004
    Messages : 19 799
    Points : 499 036
    Points
    499 036
    Par défaut
    Bonsoir,

    Pour écrire en UTF-8 dans un fichier, voici comment procéder :
    ton programme doit être lui même encodé en UTF-8 ;
    ton programme doit ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Encode;
    use utf8;
     
    open my $fh, '>encoding(UTF-8)', $fichier or die "Impossible d'écrire dans le fichier $fichier : $!\n";
    ...
    De plus, si tu lis un fichier XML en UTF-8, il doit vraiment l'être et son entête doit également le préciser.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="UTF-8"?>

    Et comme je l'ai déjà précisé dans mon tutoriel, je préconise XML::Twig, mais ce n'est que mon avis.

  15. #15
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    un super grand merci Djibril, j'ai mis au propre le fichier d'entrée, j'ai modifié mon code selon tes conseils et maintenant tout roule en utf-8, plus aucun warning et tout est bien écrit tant dans les fichiers de sortie que dans la base de donnée (où je les charge) :-)
    -- Jasmine --

+ 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, 18h17
  2. Problème de Wide character et de print :(
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 11/03/2006, 19h02
  3. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 16h44
  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, 15h26

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