通过perl one-liner处理文本为utf-16?

时间:2015-01-05 16:03:36

标签: perl unicode

perl有一个选项perl -C来处理utf-8,是否有可能告诉perl one-liner输入采用utf-16编码? BEGIN块可能用于显式更改编码,那里有更简单的方法吗?

2 个答案:

答案 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的形式似乎归结为它们是否经常使用;是否已被充分理解(有时候有些重要 - 有谁知道?);是 - 或应该 - 已经过时; ......:换句话说,它并不像看起来那么简单。

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