Encode 可以做你想做的事吗?然后,您可能必须在脚本中使用 encode() 和 decode(),因此它可能不会短于:
perl -nE 'BEGIN {binmode STDIN, ":encoding(utf16)" } ; ...'
有一个PERL_UNICODE 环境变量,但它相当有限:如果我没记错的话,它只是模仿-C。
我曾经试图找出为什么没有-C 用于“流行” UTF 形式的开关,这似乎归结为它们是否经常使用;是否被很好理解(字节序有时很重要——谁知道?);已经过时或应该过时; ... :换句话说,它并不像看起来那么简单。
c.f. @Leon Timmerman 的例子和相当彻底的 perldoc open:
% 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
编辑: 最近另一个关于如何
"Turn Off" binmode(STDOUT, ":utf8") Locally 的讨论涉及 PerlIO 和“层”,并且有一个简洁的解决方案,可能适合单行。参见
UTF-16 perl input output。
我将尝试找到一个使用Encode 的真实示例来保留可以单行的编码。它会像这样“往返”。 例如:
% file UTF16.txt
UTF16.txt: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
... 吞下它并将其重定向到不同的文件:
% 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 并以字节为单位打印文件的大小:
% diff UTF16.txt other.txt
% perl -E 'say [stat]->[7] for @ARGV' UTF16.txt other.txt
2220
2220