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 :

Gestion des caractères spéciaux


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut Gestion des caractères spéciaux
    Bonjour,

    je bloque sur une chose très bête, j'imagine, malgré les tutoriaux vu ici, à droite et à gauche pour traiter les caractères spéciaux.

    Je suis sur une version strawberry portable v5.22.

    voici une des version testée sans succès avec le fichier.text contenant :
    été


    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
    use strict;
    use warnings;
    use Encode::Locale;
    use Encode;
    my $uni_filename = decode(locale => $ARGV[0]);
    open(my $fh, "<", encode(locale_fs => $uni_filename)) || die "Can't open '$uni_filename': $!";
    binmode($fh, ":encoding(locale)");
     
    while (<$fh>) {
    	chomp;
    	print "$_\n";
    	}
     
    close $fh;
    Résultat:
    ├®t├®
    o├╣

    Je peux tester les solutions proposées sur strawberry , cygwin et linux pour vérifier si une plateforme poserait problème.

  2. #2
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,

    Perso je me méfie des "locale" on ne maîtrise pas toujours... sur des machines distantes...

    Ayant eu à gérer des alphabets différents et sur des machines différentes, j'ai pris l'habitude de le faire TOUT en utf8 :

    TOUT =
    1) le fichier.txt doit être sauvegardé en utf8 NO BOM option généralement proposée dans les éditeurs de texte (même Notepad !)
    2) dans le pgm.pl use utf8; permet d'avoir les libellés du programme.pl en utf8 (ex print "généralement proposée dans les éditeurs" sera en utf8 sans qu'il soit nécessaire de faire un encode)
    3) pour avoir les accents à la console, terminal... rien de tel que le module

    Sinon j'ai eu à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    use Encode qw(decode);										# Pour décoder From & Subject
    use Encode;																# Pour encoder en iso-8859-16
    ~~~~~~~~~~~~
    $Msg = encode("iso-8859-16", $Msg);
    uniquement pour être compatible avec les gestionnaires de messagerie Orange, Free...


    En bref en reprenant ce que tu as fait ça donnerai :


    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
     
    ActiverAccents();
     
    my $uni_filename = $ARGV[0];
    open(my $fh, '<:utf8', $uni_filename) || die "Can't open '$uni_filename': $!";
     
    while (<$fh>) {
    	chomp;
    	print "$_\n";
    }
     
    close $fh;
     
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
    #==============================================================
    sub ActiverAccents {
    	my $encodage;
    	# Windows
      	if ( lc($^O ) eq 'mswin32') {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};	
    	}
      return $encodage;
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Merci ca fonctionne

    J'ai simplifié en suivant le lien que tu as mis.
    Ca gére donc tous les fichiers entrée sortie que ce soit , STOUT,STERR, STDIN.

    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
    22
    23
    24
    25
    26
    27
       use utf8;
     
        ActiverAccents();
     
        my $uni_filename = $ARGV[0];
        open(my $fh, '<:utf8', $uni_filename) || die "Can't open '$uni_filename': $!";
     
        while (<$fh>) {
        	chomp;
        	print "$_\n";
        }
     
        close $fh;
     
     
        #==============================================================
        # Pour avoir les accents sur la console DOS
        # http://perl.developpez.com/faq/perl/?page=Terminal#AccentsDOS
        #==============================================================
        sub ActiverAccents {
     
     
    	my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ ); 
      foreach my $h ( \*STDOUT, \*STDERR, \*STDIN ) { 
        binmode $h, ":encoding(cp$codepage)"; 
      } 
    }
    Dans le lien il est indique que :
    Dans une console (Exécuter > CMD.exe) :
    - CHCP permet de connaitre la page de code active.
    850 par défaut (DOS, le poids de l'histoire ...)
    La partie de ton code avec le else correspond pour gérer un encodage différent de utf9 ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    else {
        		$encodage = `locale charmap`;
        		eval {
        			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
        				binmode $h, ":encoding($encodage)";
        			}
        		};

  4. #4
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    D’abord rendons à César ce qui appartient à djibril

    Et pour la question, c'est non !

    Le else correspond au :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( lc($^O ) eq 'mswin32') {
    donc lorsqu'on n'est pas sur Windows, on est sur Unix/Linux...

    Dans une invite de commande tu tapes chcp tu verras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    E:\_DEV>chcp
    Page de codes active*: 437
     
    E:\_DEV>
    [Edit 16:05] Les variables de Perl
    $^O contient l'OS

    lc passe la chaîne en minuscule

    donne : MSWin32

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 195
    Points : 121
    Points
    121
    Par défaut
    Merci dmganges pour ces explications et liens.
    C'est plus clair et une base pour avancer

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

Discussions similaires

  1. gestion des caractères spéciaux
    Par FamiDoo dans le forum ASP.NET
    Réponses: 11
    Dernier message: 10/07/2007, 13h35
  2. [AJAX] Gestion des caractères spéciaux
    Par CrazySeb dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/05/2007, 09h43
  3. [MySQL] Gestion des caractères spéciaux dans un update
    Par olivier94 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/03/2007, 17h13
  4. Gestion des caractères spéciaux (micro)
    Par MiJack dans le forum Delphi
    Réponses: 7
    Dernier message: 19/01/2007, 22h41
  5. Gestion des caractères spéciaux
    Par claralavraie dans le forum Oracle
    Réponses: 1
    Dernier message: 22/06/2006, 14h41

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