Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过perl一行程序将文本处理为utf-16?_Perl_Unicode - Fatal编程技术网

通过perl一行程序将文本处理为utf-16?

通过perl一行程序将文本处理为utf-16?,perl,unicode,Perl,Unicode,perl有一个选项perl-C来处理utf-8,是否可以告诉perl one liner输入是utf-16编码的?BEGIN块可以用来显式更改编码,有没有更简单的方法?可以做你想做的事?然后,您可能必须在脚本中使用encode()和decode(),因此它可能不短于: perl -nE 'BEGIN {binmode STDIN, ":encoding(utf16)" } ; ...' 有一个PERL\u UNICODE环境变量,但它相当有限:如果我没有记错的话,它只是模仿-C 我曾经

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

可以做你想做的事?然后,您可能必须在脚本中使用
encode()
decode()
,因此它可能不短于:

    perl -nE 'BEGIN {binmode STDIN, ":encoding(utf16)" } ; ...'
有一个
PERL\u UNICODE
环境变量,但它相当有限:如果我没有记错的话,它只是模仿
-C

我曾经试图找出为什么“流行的”UTF形式没有
-C
开关,这似乎归结到它们是否经常被使用;是否被很好地理解(endianness有时很重要——谁知道呢?);是或应该是过时的;…:换句话说,这并不像看上去那么简单

  • perl-MEncode-E'say for Encode->encodings(“:all”)
    将显示9种不同的UTF编码

  • 除了常见的嫌疑犯(,,等)之外,其中的一个和也能引起引人入胜的阅读

c、 f.@Leon Timmerman的例子,相当彻底:

% 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
。。。将其清除并重定向到其他文件:

% 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

你可以使用
perl-Mopen=“:std,IN,:encoding(utf-16)”-e'…

或者使用open…或者甚至是
perlrun
?@tjd中的-M标志来实现这一点,我想知道你的完整解决方案:)在Windows上,你不能这样做,因为:如果crand:encoding将以错误的顺序结束。@ikegami有趣。为什么仅在Windows上:crlf和:编码的顺序错误?:crlf仅在Windows上添加。如果其他版本添加了:crlf,那么它们也会有问题。我使用Perl 5.14在Windows上运行了上一个命令,该命令针对的是utf-16文件,Windows中的许多本机应用程序都可以查看该文件,如
type
notepad
,但Perl抱怨“utf-16:无法识别的BOM 7061”我不熟悉Windows上的perl如何与各种PerlIO层交互,但描述了许多选项(
:crlf
等)——解决方案可能就在这里。在您的情况下,文本可能是
BOM
-ed(字节顺序标记),需要小端/大端编码?如果操作系统/软件供应商和Unicode联盟尚未提供一个真正易于使用的健壮标准,可能是因为语言和书写系统不太容易使用、编码、解码,长期储存,翻译。。。即使是在纸上。@Thomson在处理Unicode、IO、层、
:bytes
:crlf
时,要制作一个在Windows和
Unix/Linux/BSD/Solaris/OSX
系列上工作的“可移植”单行程序可能很困难。现在我也有问题了。演示如何删除BOM以“取消标记”UTF-16LE编码文档。做备份听起来很可怕。这个在Windows上运行得很好。我认为中的
是必要的,关键在这里。你能再解释一下这个语法吗?
% 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 UTF16.txt other.txt
% perl -E 'say [stat]->[7] for @ARGV' UTF16.txt other.txt
2220
2220