perl有一个选项perl -C
来处理utf-8,是否有可能告诉perl one-liner输入采用utf-16编码? BEGIN块可能用于显式更改编码,那里有更简单的方法吗?
答案 0 :(得分:3)
您可以使用perl -Mopen=":std,IN,:encoding(utf-16)" -e '...'
答案 1 :(得分:2)
可Encode
做你想做的事吗?然后,您可能必须在脚本中使用encode()
和decode()
,因此它可能不会短于:
perl -nE 'BEGIN {binmode STDIN, ":encoding(utf16)" } ; ...'
有一个PERL_UNICODE
环境变量,但它相当有限:如果我没记错的话,它只是模仿-C
。
我曾试图找出为什么没有-C
开关用于#34;热门" UTF的形式似乎归结为它们是否经常使用;是否已被充分理解(有时候有些重要 - 有谁知道?);是 - 或应该 - 已经过时; ......:换句话说,它并不像看起来那么简单。
perl -MEncode -E 'say for Encode->encodings(":all")'
将显示~9种不同的UTF编码。
除了常见的嫌疑人(perlrun
,perlunitut
,perlunicode
,等),most interesting perl resources on Unicode is right here on Stackoverflow之一并且令人着迷。
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和&#34;图层&#34;并有一个整洁的解决方案,可能适合单线。另见UTF-16 perl input output。
我将尝试使用Encode
找到一个真实示例,以保留可以单行的编码。这将是类似的事情&#34;往返&#34;。 e.g :
% 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