Forum Programmation.perl substition avec perl et utf-8

Posté par  .
Étiquettes : aucune
0
13
mar.
2008

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 ?

  • # correction

    Posté par  . Évalué à 1.

    En fait le rendu est finalement correct sur le forum, c'est à la pré-visualisation que ça n'allait pas.

    ps : désolé pour l'erreur dans le titre et je voulais écrire "je l'utilise un peu". Mais on ne peut apparemment pas éditer sur ce forum.
  • # solution ?

    Posté par  . É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…
    • [^] # Re: solution ?

      Posté par  . É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''.)
      • [^] # Re: solution ?

        Posté par  . É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/é/à/'
        • [^] # "use encoding utf8"

          Posté par  . É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…)
  • # avec un fichier txt

    Posté par  . Évalué à 1.

    En fait j'ai parlé un peu trop vite en disant que je laissais tomber l'option -C

    Si j'ai par exemple un fichier txt en utf8 avec dedans école: "echo école > test.txt"

    La ligne suivante ne fonctionne pas niveau encodage et renvoie "à�cole" !
    ▸ perl -pe 'use encoding utf8 ; s/./à/' test.txt

    En revanche c'est bon avec :
    ▸ perl -C -pe 'use encoding utf8 ; s/é/à/' test.txt
    et
    ▸ perl -C -pe 'use encoding utf8 ; s/./à/' test.txt

    C'est un peu lourd quand même… :-(
    • [^] # Re: avec un fichier txt

      Posté par  . Évalué à 1.

      tiens c'est marrant car finalement

      ▸ perl -pe 'use encoding utf8 ; s/./à/' < test.txt
      renvoie bien "àcole", même sans l'option -C

      alors que
      ▸ perl -pe 'use encoding utf8 ; s/./à/' test.txt
      renvoie "à�cole" s'il n'y a pas l'option -C

      :-/
      bon faut que j'arrête de flooder moi...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.