Programmation.perl : substition avec perl et utf-8

Posté par hoshid () le 13 mars 2008
0

Bonjour



Je ne fais pas de script perl mais je l'utilise pas peu à la manière de SED pour faire des substitutions ou autres



Je suis en UTF-8 et j'ai quelques difficultés, comme dans cet exemple:


echo école | perl -pe 's/^./e/'

cela me renvoie : e�cole (edit: c'est mal rendu sur le forum, il y a juste une fois le signe avec le point d'interrogation en réalité)




Je n'ai pas ce problème avec SED. Savez-vous comment y remédier ?

> Lire le message (7 commentaires, moyenne: 1).  

Vous avez demandé le commentaire #913549.

solution ?

Posté par hoshid () le 13/03/2008 à 20:25. (lien). Évalué à 1.

Tiens, en essayant un peu par hasard d'ajouter l'option -C comme dans une ligne de code que je viens de voir sur cette page : http://www.cl.cam.ac.uk/~mgk25/unicode.html#perl

et bien ça fonctionne :

echo école | perl -C -pe 's/^./e/'

Le résultat est correct !

Je ne sais même pas ce que signifie ce -C (un tour dans "man perl" ne m'a pas renseigné)

Je vais encore chercher, mais si quelqu'un peut me le dire…

[ Répondre ]

  • [^]Re: solution ?

    Posté par Alex () le 13/03/2008 à 21:24. (lien). Évalué à 1.

    pour les options de perl
    man perlrun

    et pour le -C


    -C [number/list]
    The -C flag controls some Unicode of the Perl Unicode features.

    As of 5.8.1, the -C can be followed either by a number or a list of option letters. The letters, their numeric values, and effects are as follows; listing the letters is equal to summing the numbers.


    I 1 STDIN is assumed to be in UTF-8
    O 2 STDOUT will be in UTF-8
    E 4 STDERR will be in UTF-8
    S 7 I + O + E
    i 8 UTF-8 is the default PerlIO layer for input streams
    o 16 UTF-8 is the default PerlIO layer for output streams
    D 24 i + o
    A 32 the @ARGV elements are expected to be strings encoded in UTF-8
    L 64 normally the "IOEioA" are unconditional,
    the L makes them conditional on the locale environment
    variables (the LC_ALL, LC_TYPE, and LANG, in the order
    of decreasing precedence) -- if the variables indicate
    UTF-8, then the selected "IOEioA" are in effect




    For example, -COE and -C6 will both turn on UTF-8-ness on both STDOUT and STDERR. Repeating letters is just redundant, not cumulative nor toggling.

    The io options mean that any subsequent open() (or similar I/O operations) will have the :utf8 PerlIO layer implicitly applied to them, in other words, UTF-8 is expected from any input stream, and UTF-8 is produced to any output stream. This is just the default, with explicit layers in open() and with binmode() one can manipulate streams as usual.

    -C on its own (not followed by any number or option list), or the empty string "" for the PERL_UNICODE environment variable, has the same effect as -CSDL. In other words, the standard I/O handles and the default open() layer are UTF-8-fied but only if the locale environment variables indicate a UTF-8 locale. This behaviour follows the implicit (and problematic) UTF-8 behaviour of Perl 5.8.0.

    You can use -C0 (or "0" for PERL_UNICODE) to explicitly disable all the above Unicode features.

    The read-only magic variable ${^UNICODE} reflects the numeric value of this setting. This is variable is set during Perl startup and is thereafter read-only. If you want runtime effects, use the three-arg open() (see ``open'' in perlfunc), the two-arg binmode() (see ``binmode'' in perlfunc), and the open pragma (see open).

    (In Perls earlier than 5.8.1 the -C switch was a Win32-only switch that enabled the use of Unicode-aware ``wide system call'' Win32 APIs. This feature was practically unused, however, and the command line switch was therefore ``recycled''.)

    [ Répondre ]

    • [^]Re: solution ?

      Posté par hoshid () le 13/03/2008 à 23:23. (lien). Évalué à 1.

      Merci mais c'est assez incompréhensible en pratique pour moi

      Émettons que je veuille remplacer école par àcole :

      Ceci fonctionne :
      ▸ echo école | perl -CI -pe 's/./à/'

      Mais ceci ne fonctionne pas (renvoie "�ole" )
      ▸ echo école | perl -CI -pe 's/é/à/'

      d'un autre côté ceci fonctionne :
      ▸ echo école | perl -C -pe 's/é/à/'

      Mais pas ceci (renvoie "Ã cole") :
      ▸ echo école | perl -C -pe 's/./à/'


      J'ai beau essayer toutes les combinaisons pour l'option -C, aucune ne semble fonctionner à la fois pour 's/./à/' et 's/é/à/'

      [ Répondre ]

      • [^]"use encoding utf8"

        Posté par hoshid () le 14/03/2008 à 00:39. (lien). Évalué à 1.

        Bon j'ai fini par laisser tomber l'option -C et j'ai appris qu'on pouvait spécifier "use encoding" avec "utf8" ou ":locale"

        Avec cela le résultat est bon dans les deux cas :
        ▸ echo école | perl -pe 'use encoding utf8; s/./à/'
        ou
        ▸ echo école | perl -pe 'use encoding utf8; s/é/à/'

        En revanche j'aimerais bien savoir s'il n'y a pas moyen que Perl utilise par défaut l'utf-8, histoire de ne pas avoir à le préciser tout le temps.

        (je vais aussi chercher de mon côté, mais demain…)

        [ Répondre ]