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 hoshid . Évalué à 1.
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 hoshid . Évalué à 1.
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 Alex . Évalué à 1.
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 hoshid . Évalué à 1.
É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 hoshid . Évalué à 1.
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 hoshid . Évalué à 1.
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 hoshid . Évalué à 1.
▸ 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.