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 :

Lecture d'un fichier codé unicode en utf8


Sujet :

Langage Perl

  1. #1
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut Lecture d'un fichier codé unicode en utf8
    Bonjour,

    Je lis un fichier codé en unicode qui contient des caractères accentués dans un programme perl. Dès que j'utilise une expression régulière sur les lignes qui contiennent ces caractères accentués, j'obtiens l'erreur : "Malformed UTF-8 character (unexpected non continuation character .....".
    Je cherche le moyen 'éliminer cette erreur sans utiliser un no warnings ":encode(utf8)" (qui focntionne bien j'ai testé!). Je n'ai pas la possibilité de réencoder le ficier en entrée.

    Voici un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    use XML::Simple;
    use strict;
    use warnings;
    use Carp;
    use Data::Dumper; 
    use Encode;
     
    .....
     
    	open($PGTI,"fichier");
     
    	while (<$PGTI>) {	
    		my $ligne=$_;
    		for ($ligne) {
    		...
    		   if ( $ligne =~ /<(.*)>(\d\d\/\d\d\/\d\d\d\d \d\d:\d\d:\d\d)/) {
    		   ...
    		   }
    		}
    	}
    Je cherche une focntion qui transforme le codage au moment de la lecture; Est-ce que ca existe ?
    Je suis sur linux centos, perl v5.10

    Merci de votre aide

  2. #2
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut
    J'ai enfin trouvé la solution !!!!
    il suffit de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (<$PGTI>) {	
    		my $ligne=$_;
    		for ($ligne) {
    my $ligne_decodee=encode("utf8", $ligne);

    Et ca marche ....

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    As-tu essayé la fonction binmode ?
    Style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binmode($PGTI, ":utf8");
    Pour la gestion des caractères non ASCII dans une regexp, il me semble que tu devrais utiliser "locale" également :
    (voir docs : perldoc locale et perldoc perllocale)

    Il sera peut-être nécessaire de correctement position la locale, soit à l'extérieur de perl, grâce aux variables d'environnement LC_CTYPE, LC_*, soit grâce à la fonction du module POSIX setlocale;

  4. #4
    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
    Tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open($PGTI,"fichier");
    Quand on ouvre un fichier, il est fortement recommandé de spécifier si tu ouvres en lecture ou en écriture (en utiisant la syntaxe dite à trois arguments) et de tester si l'opération système a réussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    openmy $PGTI, "<", "fichier" or die "Ouverture impossible de "fichier" $!";
    J'ajoute que tu peux spécifier utf8 dans le mode (le second argument), ce qui permet d'utiliser une couche d'entrée-sortie utf8 et de ne plus avoir besoin de décoder.

  5. #5
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut
    Philou :

    Merci ... je viens de tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binmode($PGTI, ":utf8");
    ou fonctionnent aussi ... mes locales étant positionnées à UTF-8

    Peux-tu m'expliquer la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    binmode($PGTI, ":utf8");
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $ligne_decodee=encode("utf8", $ligne);
    ?

    Lolo : le résultat de l'open est bien testé ... j'ai simplifié car je ne voulais pas mettre mes 1000 lignes de codes ....

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Quand tu déclares avec binmode, tu n'as pas besoin de faire de conversion "ligne à ligne" (c'est auto-magique).

    L'idée de mettre l'encoding dans le open est encore plus rapide (réponse de Lolo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $FILE, "<:encoding("UTF-8")", $filename;

  7. #7
    Membre averti
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Par défaut
    OK. Merci

    Je ne peux pas mettre l'encoding dans l'open car l'open est dans un module qui sert à plusieurs fichiers et l'encoding utf8 provoque des erreurs sur les autres types de fichiers ..... je comprends pas pourquoi mais j'ai plus le temps de chercher ....
    Je vais donc utiliser binmode ou use locale ...

    Merci

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    C'est effectivement la meilleure solution dans ce cas

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

Discussions similaires

  1. Lecture fichier txt Unicode par un TRichEdit
    Par LescureImage dans le forum C++Builder
    Réponses: 0
    Dernier message: 05/03/2009, 18h55
  2. Lecture d'un fichier Unicode
    Par The_Beast dans le forum Débuter
    Réponses: 7
    Dernier message: 26/10/2008, 18h44
  3. [ksh] Lecture d'un fichier unicode ligne par ligne
    Par Arnaud F. dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 30/07/2008, 20h46
  4. Lecture fichier encodé Unicode
    Par iuchiban dans le forum Ruby
    Réponses: 1
    Dernier message: 29/03/2007, 14h33
  5. Déterminer le Type fichier texte unicode, utf8?
    Par soazig dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 08/02/2007, 22h12

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