我正在编写一个脚本,它将UTF-16编码的文本文件作为输入,并输出一个UTF-16编码的文本文件。
use open "encoding(UTF-16)";
open INPUT, "< input.txt"
or die "cannot open > input.txt: $!\n";
open(OUTPUT,"> output.txt");
while(<INPUT>) {
print OUTPUT "$_\n"
}这么说吧,我的程序将input.txt中的所有内容都写入到output.txt中。
这在我的cygwin环境中工作得很好,它使用的是"This is perl5,version14,subversion 2 (v5.14.2) built for cygwin-thread-multi-64int“。
但在我的Windows环境中,使用的是"This is Perl5,version12,subversion 3 (v5.12.3) built for MSWin32-x64-multi“,
除了第一行之外,output.txt中的每一行都以疯狂的符号作为前缀。
例如:
<FIRST LINE OF TEXT>
㈀ Ⰰ ㈀Ⰰ 嘀愀 ㌀ 䌀栀椀愀 䐀⸀⸀⸀ 儀甀愀渀最 䠀ഊ<SECOND LINE OF TEXT>
...有没有人能解释一下为什么它可以在cygwin上运行,但不能在windows上运行?
编辑:按照建议打印编码层后。
在Windows环境中:
unix
crlf
encoding(UTF-16)
utf8
unix
crlf
encoding(UTF-16)
utf8在Cygwin环境中:
unix
perlio
encoding(UTF-16)
utf8
unix
perlio
encoding(UTF-16)
utf8唯一的区别是perlio层和crlf层。
发布于 2012-10-28 15:00:42
我本打算等待并给出一个彻底的答案,但我给你一个快速的答案可能比什么都没有要好。
问题是crlf和encoding层的顺序错误。不是你的错。
例如,假设您使用UTF-16le执行print "a\nb\nc\n"; (因为它更简单,而且可能正是您真正想要的)。你最终会得到
61 00 0D 0A 00 62 00 0D 0A 00 63 00 0D 0A 00而不是
61 00 0D 00 0A 00 62 00 0D 00 0A 00 63 00 0D 00 0A 00我不认为您可以使用open杂注或binmode获得正确的结果,但可以使用open来完成。
open(my $fh, '<:raw:encoding(UTF-16):crlf', $qfn)您将需要附加一个带有较旧版本的:utf8。
它可以在cygwin上运行,因为crlf层只在Windows上添加。这样你就会得到
61 00 0A 00 62 00 0A 00 63 00 0A 00发布于 2012-10-28 08:54:02
您的编码中有一个拼写错误。它应该是use open ":encoding(UTF-16)"注意冒号。我不知道为什么它可以在Cygwin上工作,但不能在Windows上工作,但也可能是5.12和5.14之间的事情。Perl似乎弥补了这一点,但它可能是导致您的问题的原因。
如果这不起作用,请检查编码是否应用于您的文件句柄。
print map { "$_\n" } PerlIO::get_layers(*INPUT);
print map { "$_\n" } PerlIO::get_layers(*OUTPUT);使用词法文件句柄(即open my $fh, "<", $file)。Glob文件句柄是全局的,因此程序中的其他东西可能会干扰它们。
如果所有这些都验证了,如果词法文件句柄正在应用encoding(UTF-16),请让我们知道,我们可以尝试其他方法。
更新:This may provide your answer:"ed UTF文件不适合流式模型,必须将它们作为二进制文件。“看起来您必须以二进制格式读取文件,并以字符串格式进行编码。这可能是5.14中修复的错误。
更新2:是的,我可以确认这就是a bug that was fixed in 5.14。
https://stackoverflow.com/questions/13105361
复制相似问题