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 :

Console DOS et accents


Sujet :

Langage Perl

  1. #1
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut Console DOS et accents
    Salut,

    Comme vous le savez, il est impossible d'afficher des accents sous une console DOS.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "Tété est à la maison\n";
    donne ceci
    T├®t├® est ├á la maison
    Je ne me rappelle plus du code Perl permettant d'afficher un accent tel é sur la console dos.

    Merci

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Je me réponds :
    ü : \x81
    é : \x82
    â : \x83
    ä : \x84
    à : \x85
    ç : \x87
    ê : \x88
    ë : \x89
    è : \x8A
    ï : \x8B
    î : \x8C

    Si quelqu'un a une liste plus complète (un site)

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il faut mettre stdout avec l'encodage correct, ou utiliser l'un des modules spécialisés. (chcp permet de récupérer la codepage correcte)

    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
    #!/usr/bin/perl
    use strict; use warnings;
    use utf8; use 5.10.0;
     
    my ($codepage) = (`chcp` =~ m/:\s+(\d+)/);
    foreach my $h ( \*STDOUT, \*STDERR, \*STDIN ) {
      binmode $h, ":encoding(cp$codepage)";
    }
     
    say "J'essaie d'utiliser des accents àéé";
     
    say "Essayons les entrées-sorties : ";
    my $input = <>;
    print $input;
     
    open my($file), '>:utf8', "testOutput"
      or die "Cannot open testOutput : $!\n";
    print {$file} $input;
     
    __END__
    Le système de gestion des encodages de Perl est excellent, puissant et pratique, mais mal compris par pas mal de gens.

    --
    Jedaï

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Y a t il une façon plus propre d'afficher les accents correctement sous la console DOS, même si dans les faits, l'affichage est correct.

    J'ai vu une liste dans le module Locale::RecodeData::IBM865 .
    Ça peut être intéressant d'implémenter un print like (printDOS) uniquement pour l'affichage sous DOS et convertissant tous les caractères accentués en code hexa via cette liste :
    Local | ISO-10646 | Description
    -------+-----------+-------------------------------------------------
    00 | 00000000 | NULL (NUL)
    01 | 00000001 | START OF HEADING (SOH)
    02 | 00000002 | START OF TEXT (STX)
    03 | 00000003 | END OF TEXT (ETX)
    04 | 00000004 | END OF TRANSMISSION (EOT)
    05 | 00000005 | ENQUIRY (ENQ)
    06 | 00000006 | ACKNOWLEDGE (ACK)
    07 | 00000007 | BELL (BEL)
    08 | 00000008 | BACKSPACE (BS)
    09 | 00000009 | CHARACTER TABULATION (HT)
    0A | 0000000A | LINE FEED (LF)
    0B | 0000000B | LINE TABULATION (VT)
    0C | 0000000C | FORM FEED (FF)
    0D | 0000000D | CARRIAGE RETURN (CR)
    0E | 0000000E | SHIFT OUT (SO)
    0F | 0000000F | SHIFT IN (SI)
    10 | 00000010 | DATALINK ESCAPE (DLE)
    11 | 00000011 | DEVICE CONTROL ONE (DC1)
    12 | 00000012 | DEVICE CONTROL TWO (DC2)
    13 | 00000013 | DEVICE CONTROL THREE (DC3)
    14 | 00000014 | DEVICE CONTROL FOUR (DC4)
    15 | 00000015 | NEGATIVE ACKNOWLEDGE (NAK)
    16 | 00000016 | SYNCHRONOUS IDLE (SYN)
    17 | 00000017 | END OF TRANSMISSION BLOCK (ETB)
    18 | 00000018 | CANCEL (CAN)
    19 | 00000019 | END OF MEDIUM (EM)
    1A | 0000001A | SUBSTITUTE (SUB)
    1B | 0000001B | ESCAPE (ESC)
    1C | 0000001C | FILE SEPARATOR (IS4)
    1D | 0000001D | GROUP SEPARATOR (IS3)
    1E | 0000001E | RECORD SEPARATOR (IS2)
    1F | 0000001F | UNIT SEPARATOR (IS1)
    20 | 00000020 | SPACE
    21 | 00000021 | EXCLAMATION MARK
    22 | 00000022 | QUOTATION MARK
    23 | 00000023 | NUMBER SIGN
    24 | 00000024 | DOLLAR SIGN
    25 | 00000025 | PERCENT SIGN
    26 | 00000026 | AMPERSAND
    27 | 00000027 | APOSTROPHE
    28 | 00000028 | LEFT PARENTHESIS
    29 | 00000029 | RIGHT PARENTHESIS
    2A | 0000002A | ASTERISK
    2B | 0000002B | PLUS SIGN
    2C | 0000002C | COMMA
    2D | 0000002D | HYPHEN-MINUS
    2E | 0000002E | FULL STOP
    2F | 0000002F | SOLIDUS
    30 | 00000030 | DIGIT ZERO
    31 | 00000031 | DIGIT ONE
    32 | 00000032 | DIGIT TWO
    33 | 00000033 | DIGIT THREE
    34 | 00000034 | DIGIT FOUR
    35 | 00000035 | DIGIT FIVE
    36 | 00000036 | DIGIT SIX
    37 | 00000037 | DIGIT SEVEN
    38 | 00000038 | DIGIT EIGHT
    39 | 00000039 | DIGIT NINE
    3A | 0000003A | COLON
    3B | 0000003B | SEMICOLON
    3C | 0000003C | LESS-THAN SIGN
    3D | 0000003D | EQUALS SIGN
    3E | 0000003E | GREATER-THAN SIGN
    3F | 0000003F | QUESTION MARK
    40 | 00000040 | COMMERCIAL AT
    41 | 00000041 | LATIN CAPITAL LETTER A
    42 | 00000042 | LATIN CAPITAL LETTER B
    43 | 00000043 | LATIN CAPITAL LETTER C
    44 | 00000044 | LATIN CAPITAL LETTER D
    45 | 00000045 | LATIN CAPITAL LETTER E
    46 | 00000046 | LATIN CAPITAL LETTER F
    47 | 00000047 | LATIN CAPITAL LETTER G
    48 | 00000048 | LATIN CAPITAL LETTER H
    49 | 00000049 | LATIN CAPITAL LETTER I
    4A | 0000004A | LATIN CAPITAL LETTER J
    4B | 0000004B | LATIN CAPITAL LETTER K
    4C | 0000004C | LATIN CAPITAL LETTER L
    4D | 0000004D | LATIN CAPITAL LETTER M
    4E | 0000004E | LATIN CAPITAL LETTER N
    4F | 0000004F | LATIN CAPITAL LETTER O
    50 | 00000050 | LATIN CAPITAL LETTER P
    51 | 00000051 | LATIN CAPITAL LETTER Q
    52 | 00000052 | LATIN CAPITAL LETTER R
    53 | 00000053 | LATIN CAPITAL LETTER S
    54 | 00000054 | LATIN CAPITAL LETTER T
    55 | 00000055 | LATIN CAPITAL LETTER U
    56 | 00000056 | LATIN CAPITAL LETTER V
    57 | 00000057 | LATIN CAPITAL LETTER W
    58 | 00000058 | LATIN CAPITAL LETTER X
    59 | 00000059 | LATIN CAPITAL LETTER Y
    5A | 0000005A | LATIN CAPITAL LETTER Z
    5B | 0000005B | LEFT SQUARE BRACKET
    5C | 0000005C | REVERSE SOLIDUS
    5D | 0000005D | RIGHT SQUARE BRACKET
    5E | 0000005E | CIRCUMFLEX ACCENT
    5F | 0000005F | LOW LINE
    60 | 00000060 | GRAVE ACCENT
    61 | 00000061 | LATIN SMALL LETTER A
    62 | 00000062 | LATIN SMALL LETTER B
    63 | 00000063 | LATIN SMALL LETTER C
    64 | 00000064 | LATIN SMALL LETTER D
    65 | 00000065 | LATIN SMALL LETTER E
    66 | 00000066 | LATIN SMALL LETTER F
    67 | 00000067 | LATIN SMALL LETTER G
    68 | 00000068 | LATIN SMALL LETTER H
    69 | 00000069 | LATIN SMALL LETTER I
    6A | 0000006A | LATIN SMALL LETTER J
    6B | 0000006B | LATIN SMALL LETTER K
    6C | 0000006C | LATIN SMALL LETTER L
    6D | 0000006D | LATIN SMALL LETTER M
    6E | 0000006E | LATIN SMALL LETTER N
    6F | 0000006F | LATIN SMALL LETTER O
    70 | 00000070 | LATIN SMALL LETTER P
    71 | 00000071 | LATIN SMALL LETTER Q
    72 | 00000072 | LATIN SMALL LETTER R
    73 | 00000073 | LATIN SMALL LETTER S
    74 | 00000074 | LATIN SMALL LETTER T
    75 | 00000075 | LATIN SMALL LETTER U
    76 | 00000076 | LATIN SMALL LETTER V
    77 | 00000077 | LATIN SMALL LETTER W
    78 | 00000078 | LATIN SMALL LETTER X
    79 | 00000079 | LATIN SMALL LETTER Y
    7A | 0000007A | LATIN SMALL LETTER Z
    7B | 0000007B | LEFT CURLY BRACKET
    7C | 0000007C | VERTICAL LINE
    7D | 0000007D | RIGHT CURLY BRACKET
    7E | 0000007E | TILDE
    7F | 0000007F | DELETE (DEL)
    80 | 000000C7 | LATIN CAPITAL LETTER C WITH CEDILLA
    81 | 000000FC | LATIN SMALL LETTER U WITH DIAERESIS
    82 | 000000E9 | LATIN SMALL LETTER E WITH ACUTE
    83 | 000000E2 | LATIN SMALL LETTER A WITH CIRCUMFLEX
    84 | 000000E4 | LATIN SMALL LETTER A WITH DIAERESIS
    85 | 000000E0 | LATIN SMALL LETTER A WITH GRAVE
    86 | 000000E5 | LATIN SMALL LETTER A WITH RING ABOVE
    87 | 000000E7 | LATIN SMALL LETTER C WITH CEDILLA
    88 | 000000EA | LATIN SMALL LETTER E WITH CIRCUMFLEX
    89 | 000000EB | LATIN SMALL LETTER E WITH DIAERESIS
    8A | 000000E8 | LATIN SMALL LETTER E WITH GRAVE
    8B | 000000EF | LATIN SMALL LETTER I WITH DIAERESIS
    8C | 000000EE | LATIN SMALL LETTER I WITH CIRCUMFLEX
    8D | 000000EC | LATIN SMALL LETTER I WITH GRAVE
    8E | 000000C4 | LATIN CAPITAL LETTER A WITH DIAERESIS
    8F | 000000C5 | LATIN CAPITAL LETTER A WITH RING ABOVE
    90 | 000000C9 | LATIN CAPITAL LETTER E WITH ACUTE
    91 | 000000E6 | LATIN SMALL LETTER AE
    92 | 000000C6 | LATIN CAPITAL LETTER AE
    93 | 000000F4 | LATIN SMALL LETTER O WITH CIRCUMFLEX
    94 | 000000F6 | LATIN SMALL LETTER O WITH DIAERESIS
    95 | 000000F2 | LATIN SMALL LETTER O WITH GRAVE
    96 | 000000FB | LATIN SMALL LETTER U WITH CIRCUMFLEX
    97 | 000000F9 | LATIN SMALL LETTER U WITH GRAVE
    98 | 000000FF | LATIN SMALL LETTER Y WITH DIAERESIS
    99 | 000000D6 | LATIN CAPITAL LETTER O WITH DIAERESIS
    9A | 000000DC | LATIN CAPITAL LETTER U WITH DIAERESIS
    9B | 000000F8 | LATIN SMALL LETTER O WITH STROKE
    9C | 000000A3 | POUND SIGN
    9D | 000000D8 | LATIN CAPITAL LETTER O WITH STROKE
    9E | 000020A7 | PESETA SIGN
    9F | 00000192 | LATIN SMALL LETTER F WITH HOOK
    A0 | 000000E1 | LATIN SMALL LETTER A WITH ACUTE
    A1 | 000000ED | LATIN SMALL LETTER I WITH ACUTE
    A2 | 000000F3 | LATIN SMALL LETTER O WITH ACUTE
    A3 | 000000FA | LATIN SMALL LETTER U WITH ACUTE
    A4 | 000000F1 | LATIN SMALL LETTER N WITH TILDE
    A5 | 000000D1 | LATIN CAPITAL LETTER N WITH TILDE
    A6 | 000000AA | FEMININE ORDINAL INDICATOR
    A7 | 000000BA | MASCULINE ORDINAL INDICATOR
    A8 | 000000BF | INVERTED QUESTION MARK
    A9 | 00002310 | REVERSED NOT SIGN
    AA | 000000AC | NOT SIGN
    AB | 000000BD | VULGAR FRACTION ONE HALF
    AC | 000000BC | VULGAR FRACTION ONE QUARTER
    AD | 000000A1 | INVERTED EXCLAMATION MARK
    AE | 000000AB | LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    AF | 000000A4 | CURRENCY SIGN
    B0 | 00002591 | LIGHT SHADE
    B1 | 00002592 | MEDIUM SHADE
    B2 | 00002593 | DARK SHADE
    B3 | 00002502 | BOX DRAWINGS LIGHT VERTICAL
    B4 | 00002524 | BOX DRAWINGS LIGHT VERTICAL AND LEFT
    B5 | 00002561 | BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
    B6 | 00002562 | BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
    B7 | 00002556 | BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
    B8 | 00002555 | BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
    B9 | 00002563 | BOX DRAWINGS DOUBLE VERTICAL AND LEFT
    BA | 00002551 | BOX DRAWINGS DOUBLE VERTICAL
    BB | 00002557 | BOX DRAWINGS DOUBLE DOWN AND LEFT
    BC | 0000255D | BOX DRAWINGS DOUBLE UP AND LEFT
    BD | 0000255C | BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
    BE | 0000255B | BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
    BF | 00002510 | BOX DRAWINGS LIGHT DOWN AND LEFT
    C0 | 00002514 | BOX DRAWINGS LIGHT UP AND RIGHT
    C1 | 00002534 | BOX DRAWINGS LIGHT UP AND HORIZONTAL
    C2 | 0000252C | BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
    C3 | 0000251C | BOX DRAWINGS LIGHT VERTICAL AND RIGHT
    C4 | 00002500 | BOX DRAWINGS LIGHT HORIZONTAL
    C5 | 0000253C | BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
    C6 | 0000255E | BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
    C7 | 0000255F | BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
    C8 | 0000255A | BOX DRAWINGS DOUBLE UP AND RIGHT
    C9 | 00002554 | BOX DRAWINGS DOUBLE DOWN AND RIGHT
    CA | 00002569 | BOX DRAWINGS DOUBLE UP AND HORIZONTAL
    CB | 00002566 | BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
    CC | 00002560 | BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
    CD | 00002550 | BOX DRAWINGS DOUBLE HORIZONTAL
    CE | 0000256C | BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
    CF | 00002567 | BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
    D0 | 00002568 | BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
    D1 | 00002564 | BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
    D2 | 00002565 | BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
    D3 | 00002559 | BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
    D4 | 00002558 | BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
    D5 | 00002552 | BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
    D6 | 00002553 | BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
    D7 | 0000256B | BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
    D8 | 0000256A | BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
    D9 | 00002518 | BOX DRAWINGS LIGHT UP AND LEFT
    DA | 0000250C | BOX DRAWINGS LIGHT DOWN AND RIGHT
    DB | 00002588 | FULL BLOCK
    DC | 00002584 | LOWER HALF BLOCK
    DD | 0000258C | LEFT HALF BLOCK
    DE | 00002590 | RIGHT HALF BLOCK
    DF | 00002580 | UPPER HALF BLOCK
    E0 | 000003B1 | GREEK SMALL LETTER ALPHA
    E1 | 000000DF | LATIN SMALL LETTER SHARP S (German)
    E2 | 00000393 | GREEK CAPITAL LETTER GAMMA
    E3 | 000003C0 | GREEK SMALL LETTER PI
    E4 | 000003A3 | GREEK CAPITAL LETTER SIGMA
    E5 | 000003C3 | GREEK SMALL LETTER SIGMA
    E6 | 000000B5 | MICRO SIGN
    E7 | 000003C4 | GREEK SMALL LETTER TAU
    E8 | 000003A6 | GREEK CAPITAL LETTER PHI
    E9 | 00000398 | GREEK CAPITAL LETTER THETA
    EA | 000003A9 | GREEK CAPITAL LETTER OMEGA
    EB | 000003B4 | GREEK SMALL LETTER DELTA
    EC | 0000221E | INFINITY
    ED | 000003C6 | GREEK SMALL LETTER PHI
    EE | 000003B5 | GREEK SMALL LETTER EPSILON
    EF | 00002229 | INTERSECTION
    F0 | 00002261 | IDENTICAL TO
    F1 | 000000B1 | PLUS-MINUS SIGN
    F2 | 00002265 | GREATER-THAN OR EQUAL TO
    F3 | 00002264 | LESS-THAN OR EQUAL TO
    F4 | 00002320 | TOP HALF INTEGRAL
    F5 | 00002321 | BOTTOM HALF INTEGRAL
    F6 | 000000F7 | DIVISION SIGN
    F7 | 00002248 | ALMOST EQUAL TO
    F8 | 000000B0 | DEGREE SIGN
    F9 | 00002219 | BULLET OPERATOR
    FA | 000000B7 | MIDDLE DOT
    FB | 0000221A | SQUARE ROOT
    FC | 0000207F | SUPERSCRIPT LATIN SMALL LETTER N
    FD | 000000B2 | SUPERSCRIPT TWO
    FE | 000025A0 | BLACK SQUARE
    FF | 000000A0 | NO-BREAK SPACE

  5. #5
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Citation Envoyé par Jedai Voir le message
    Il faut mettre stdout avec l'encodage correct, ou utiliser l'un des modules spécialisés. (chcp permet de récupérer la codepage correcte)

    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
    #!/usr/bin/perl
    use strict; use warnings;
    use utf8; use 5.10.0;
     
    my ($codepage) = (`chcp` =~ m/:\s+(\d+)/);
    foreach my $h ( \*STDOUT, \*STDERR, \*STDIN ) {
      binmode $h, ":encoding(cp$codepage)";
    }
     
    say "J'essaie d'utiliser des accents àéé";
     
    say "Essayons les entrées-sorties : ";
    my $input = <>;
    print $input;
     
    open my($file), '>:utf8', "testOutput"
      or die "Cannot open testOutput : $!\n";
    print {$file} $input;
     
    __END__
    Le système de gestion des encodages de Perl est excellent, puissant et pratique, mais mal compris par pas mal de gens.

    --
    Jedaï
    Ok.
    La commande chcp permet d'afficher le numéro du jeu de caractères (page de codes) en cours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($codepage) = (`chcp` =~ m/:\s+(\d+)/);
    récupère ainsi le code : 850 dans mon cas.

    Ensuite tu encodes tout ce qui passe par STDOUT, STDERR et STDIN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $h ( \*STDOUT, \*STDERR, \*STDIN ) {
      binmode $h, ":encoding(cp$codepage)";
    }
    Par contre, si notre script est en utf8, il faut absolument mettre sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "J'essaie d'utiliser des accents àéé\n";
    print "Essayons les entrées-sorties : \n";
    s'affiche mal, par contre le résultat du STDIN est OK,

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par djibril Voir le message
    Par contre, si notre script est en utf8, il faut absolument mettre sinon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "J'essaie d'utiliser des accents àéé\n";
    print "Essayons les entrées-sorties : \n";
    s'affiche mal, par contre le résultat du STDIN est OK,
    Tout à fait, c'est indépendant de la question de la console, si Perl ne sait pas que ton script est en utf8 il le lira incorrectement. Tout mes scripts sont en utf8, strict, avec warnings et sous 5.10 maintenant, donc je rajoute automatiquement les deux lignes initiales (il y a des moyens de réunir tout ça dans un seul import toutefois).

    En fait le système de Perl est relativement simple : les strings sont soit des chaînes d'octets, soit des chaînes de caractères. Si elles sont des chaînes de caractères peu importe leur origine, elles sont "compatibles", les regexs marchent bien, les concaténations aussi, etc...
    Donc tout va bien en interne, mais il est important d'effectuer les traductions correcte sur les interfaces avec le monde extérieur. Si ce n'est pas le cas, alors les choses peuvent mal se passer.
    Le problème c'est que de temps en temps ça marche quand même, ce qui laisse le débutant croire qu'il a fait ça correctement : par exemple même s'il ne change pas l'encodage sur STDOUT et STDIN, ce qu'il lit sur STDIN s'affichera correctement sur STDOUT, c'est pour ça que j'ai rajouté l'écriture vers un fichier en utf8, sans les changements d'encodage, ceci échoue, alors qu'avec mon script ça réussit (bien que l'encodage d'origine et d'arrivée soient complètement différent, et d'ailleurs que l'encodage d'arrivée ne soit pas toujours le même non plus).

    La possibilité d'écrire son script dans un encodage quelconque (pris en charge par Perl, cf le pragma encoding) n'est qu'un bonus bienvenue pour les programmeurs non-anglais.

    --
    Jedaï

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Tout à fait d'accord avec toi.
    Pour l'instant je travail sous Perl 5.8.8, Il est vrai que je pourrais passer à Perl 5.10, mais bon, pour l'instant je n'ai pas changé.
    Concernant l'encodage de mes scripts, ils sont tous en utf8, mais il est vrai qu'en cas de changement d'éditeurs de texte, de PC, etc, les éditeurs ne sont pas toujours configurés en utf8 par défaut, donc il faut vraiment y penser, sous Linux, la question ne se pose plus.
    D'ailleurs question bête, est il possible au sein même du script de savoir si on est en utf8 ou non ?
    Pour la création d'un fichier en utf8, c'est moins compliqué car quelque soit l'encodage du script, open permet de préciser un encodage si besoin.

    Sinon, il est aussi possible s'il on ne souhaite pas appliquer l'encodage cpXXX sur tout le STDOUT d'utiliser le module Encode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    use utf8;
    use Encode;
    print encode("cp$codepage", $text);
    Sinon, jedai, dans tous les cas, on peut toujours utiliser le code hexa non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "J'essaie d'utiliser des accents \x85\x82\x82\n";
    Dans tous les cas, quelque soit l'encodage du script, ça passe. Je rappel que le but est juste de faire un affichage avec accents sur une console DOS.

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par djibril Voir le message
    Sinon, jedai, dans tous les cas, on peut toujours utiliser le code hexa non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "J'essaie d'utiliser des accents \x85\x82\x82\n";
    On peut (pourvu qu'on ne touche pas aux encodage des handles), mais ça me semble une mauvaise idée à plusieurs titres : d'une part la chaîne n'est plus lisible directement dans votre code, ce qui est désagréable (et comme tu viens de le prouver, se rappeler des codes hexa correct éternellement n'est pas donné à tout le monde) a fortiori pour un autre programmeur, d'autre part si tu prends cette habitude, que ton script grossit et que tu veux le rendre multi-plateforme, tu vas devoir changer ces chaînes éparpillées parmi tes scripts et modules au lieu de changer un petit bout de code, finalement la solution que je propose a une portée plus générale que l'utilisation de code hexa (et elle n'est guère plus lourde, 3 lignes de code en début de script) puisqu'elle traitera également les affichages et chaînes provenant de modules tiers.

    --
    Jedaï

  9. #9
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut

    c'est vrai que ce n'est pas très propre et encore moins portable et maintenable.

    J'ai mis un code dans nos sources pour aider tout le monde.

  10. #10
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Le code a été mis à jour dans la FAQ pour faciliter l'affichage des accents également sous Linux.

  11. #11
    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
    MERCI djibril
    Pour info, car tu t'en es peut-être pas aperçu, ou tout simplement c'est une impossibilité... avec Term::UI & Term::ReadLine ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    prompt   => "Choisissez une région de France : ",
    Choisissez une rÚgion de France : [24]:

  12. #12
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Oui, avec prompt ça ne fonctionne pas. C'est surement à cause d'un autre fonctionnement interne du module.

  13. #13
    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
    Éventuellement tu peux ajouter qu'en Cygwin :
    lc($^O ) est égal à 'mswin32'
    que locale charmap renvoie CP850
    Michel@MiDo ~
    $ locale charmap
    CP850

    Michel@MiDo ~
    $
    Donc pour avoir les accents en utilisant ta procédure sans modification, il faut passer la console Cygwin en CP850
    Pour se faire :
    - Clic droit dans la barre des menus
    -> Options -> Text
    Locale = C
    Character set = CP850

    comme sur l'image Cygwin.jpg:
    Échec de l'upload du fichier.
    http://cjoint.com/?CEtqltL7KbZ

  14. #14
    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
    Avec prompt, on peut faire une conversion en cp850 (ou autre...) du libellé...

    Là je l'ai mis en dur :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
    use Term::UI;                                     # Pour interaction avec la console
    use Term::ReadLine;                               # Pour interaction avec la console
    use Encode;
     
    ActiverAccents();
     
    my @Tab = ("TéTè","TïTù","TITI","TàTë");
    my $Lib = "Choisissez un libellé avec ou sans les accents : éèçàëêù : ";
    $Lib = encode("cp850", $Lib);
     
    my $term               = Term::ReadLine->new('brand');
    my $nom_region_choisie = $term->get_reply(
      print_me => "1- Listons tous les libellés",
      prompt   => $Lib,
      choices  => \@Tab,
      default  => 'TITI',
    );
     
    print "Fin\n";
     
     
    #==============================================================
    # 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;
    }
     
    #Sinon :
    #ü 	\x81 	à 	\x85 	è 	\x8A
    #é 	\x82 	ç 	\x87 	ï 	\x8B
    #â 	\x83 	ê 	\x88 	î 	\x8C
    #ä 	\x84 	ë 	\x89
    C:\_DevOra>perl connexion.pl
    1- Listons tous les libellés
    1> TéTè
    2> TïTù
    3> TITI
    4> TàTë

    Choisissez un libellé avec ou sans les accents : éèçàëêù : [3]:
    Fin

    C:\_DevOra>

  15. #15
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Tu n'es pas obligé de forcer l'encodage cp850. Ma procédure de la retourne. Tu la récupère et encode ton prompt.
    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
    45
    46
    #!/usr/bin/perl
    use warnings;
    use strict;
    use utf8;
    use Term::UI;                                     # Pour interaction avec la console
    use Term::ReadLine;                               # Pour interaction avec la console
    use Encode;
     
    my $encodage = ActiverAccents();
    my $term                    = Term::ReadLine->new('brand');
    my $nom_region_choisie = $term->get_reply(
      print_me => "1- Listons tous les libellés",
      prompt   => encode($encodage, "Choisissez un libellé avec ou sans les accents : éèçàëêù : "),
      choices  => ["TéTè","TïTù","TITI","TàTë"],
      default  => 'TITI',
    );
     
    print "Fin\n";
     
     
    #==============================================================
    # Pour avoir les accents sur la console DOS
    # http://perl.developpez.com/faq/perl/?page=Terminal#Accents
    #==============================================================
    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;
    }

  16. #16
    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
    Oui j'ai réalisé après, j'allais faire çà ce matin à la fraîche
    MERCI

    Dis-moi si je peux, dois... enlever le lien ci-joint ci-dessus, l'image sur ci-joint...
    Inutile d'encombrer de l'espace disque inutilement pour l'éternité

  17. #17
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Tu peux laisser, ça ne pose pas de souci.

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    Bonjour

    Je suis nouveau en Perl aussi j'ai lu vos post concernant l'accentuation. J'ai essayé toutes les méthodes que vous y préconisez mais sans succès. Pour être sûr de ne pas faire d'erreur dans la recopie j'ai fait un "copier/coller" de tous vos exemples (pas en même temps bien sûr), et aucun n'a marché. Par contre tout le reste fonctionne très bien, j'arrive même à me connecter à mes bases MySQL

    Voici ce que me répond Perl lors des essais :

    D:\Perl>perl accents.pl

    Malformed UTF-8 character: \xe7\x6f\x6e (unexpected non-continuation byte 0x6f, immediately after start byte 0xe7; need 3 bytes, got 1) at accents.pl line 5.
    Malformed UTF-8 character (fatal) at accents.pl line 5.


    Pour moi cela ressemble un peu à de l'hébreu.
    Je travaille sous Windows 11, et la version 5.32.1 de Perl.

    Merci pour votre aide.

    Gérard

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    J'ai résolu mon problème, en mettant en tête de mon fichier ces deux instructions :

    #!/usr/bin/perl
    system('chcp 1252 > nul');

    gérard

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

Discussions similaires

  1. Cacher la console dos
    Par Jbx 2.0b dans le forum SDL
    Réponses: 5
    Dernier message: 09/10/2009, 12h15
  2. Console DOS
    Par Cartouche dans le forum GLUT
    Réponses: 7
    Dernier message: 25/04/2006, 21h50
  3. [base de registre] Ouverture console DOS sur click droit
    Par SteelBox dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 11/02/2006, 02h02
  4. Postgresql 8, pgadmin et console Dos
    Par djibril dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 04/02/2005, 16h48
  5. [Encodage] Charset et console Dos
    Par ToYonos dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 01/02/2005, 12h10

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