perl a une option perl -C
Pour traiter utf-8, est-il possible de dire à Perl one-liner que l'entrée est encodée en utf-16? Le bloc BEGIN peut être utilisé pour changer explicitement le codage, une manière plus simple?
Réponses:
2 pour la réponse № 1Pouvez Encode
fais ce que tu veux? Vous devrez alors peut-être utiliser encode()
et decode()
dans votre script, il ne devrait donc pas être plus court que:
perl -nE "BEGIN {binmode STDIN, ":encoding(utf16)" } ; ..."
Il y a un PERL_UNICODE
variable d’environnement, mais elle est assez limitée: elle mime simplement -C
si je me souviens bien.
Une fois, j'ai essayé de savoir pourquoi il n'y avait pas -C
commutateurs pour les formes "populaires" de UTF et il semblaitdéterminer si elles sont fréquemment utilisées ou non; sont ou ne sont pas bien compris (l'endianité compte parfois - qui savait?); sont - ou devraient être - obsolètes; ...: autrement dit, ce n'est pas aussi simple qu'il y paraît.
perl -MEncode -E "say for Encode->encodings(":all")"
montrera ~ 9 encodages UTF différents.En plus des suspects habituels (
perlrun
,perlunitut
,perlunicode
, etc.), un de les ressources perl les plus intéressantes sur Unicode se trouvent ici sur Stackoverflow et fait pour la lecture fascinante.
c.f. @Leon Timmerman "s exemple et perldoc open
ce qui est assez complet:
% perl -Mopen=":std,:encoding(utf-16)" -E "print <>" UTF16.txt > other.txt
% file other.txt
other.txt: Big-endian UTF-16 Unicode text, with CRLF line terminators
Modifier: Une autre discussion récente demandant comment "Désactiver" binmode (STDOUT, ": utf8") localement touche à PerlIO et aux "couches" et offre une solution soignée qui pourrait se prêter à une ligne. Voir Sortie d'entrée UTF-16 perl ainsi que.
Je vais essayer de trouver un exemple réel en utilisant Encode
pour préserver le codage qui peut être une ligne. Ce serait quelque chose comme ce "aller-retour". par exemple.:
% file UTF16.txt
UTF16.txt: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
... récupérez-le et redirigez-le vers un autre fichier:
% perl -00 -MEncode="encode,decode" -E "
$text = decode("UTF-16LE", <>) ;
print encode("UTF-16LE", $text)" UTF16.txt > other.txt
% file other.txt
other.txt: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
diff
et imprimer la taille du fichier en octets:
% diff UTF16.txt other.txt
% perl -E "say [stat]->[7] for @ARGV" UTF16.txt other.txt
2220
2220
3 pour la réponse № 2
Vous pouvez le faire en utilisant perl -Mopen=":std,IN,:encoding(utf-16)" -e "..."