/ / Traiter le texte comme utf-16 via Perl one-liner? - perl, unicode

Traiter le texte comme utf-16 via perl one-liner? - perl, unicode

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 № 1

Pouvez 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.

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 "..."