我正在编写一个脚本,它以UTF-16编码的文本文件作为input,并输出一个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 perl 5,version 14,subversion 2(v5.14.2)for cygwin-thread-multi-64int”
但在我的Windows环境下,使用“这是为MSWin32-x64-multi-thread构build的perl 5,版本12,subversion 3(v5.12.3)”,
为什么直接打印到控制台/terminal比redirect要慢?
绝对最快的方式来存储一个32位整数磁盘?
ReadFileEx()完成例程不被调用
我是否可以使用O_DIRECT进行写入请求,以避免在电源故障期间丢失数据?
在进程调用之间传输数据
output.txt中的每一行除了第一行之外都预先包含疯狂的符号。
例如:
<FirsT LINE OF TEXT> ㈀ Ⰰ ㈀Ⰰ 嘀愀 ㌀ 䌀栀椀愀 䐀⸀⸀⸀ 儀甀愀渀最 䠀ഊ<SECOND LINE OF TEXT> ...
任何人都可以提供一些见解,为什么它在cygwin,但不是Windows的作品?
编辑:按照build议打印编码层后。
在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层之间。
什么时候write()到一个文件返回EWOULDBLOCK?
逻辑扩展文件失败
如何在Windows上创build,然后primefaces重命名文件在Java?
如何使CreateFile尽可能快
bash脚本导航目录子结构,然后对.xml文件进行操作
[我会等待,并给出一个彻底的答案,但是如果我给你一个快速的答案,可能比没有更好。 ]
问题是crlf和encoding层的顺序是错误的。 不是你的错。
例如,假设你print "anbncn"; 使用UTF-16le(因为它更简单,这可能是你真正想要的)。 你最终会
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)
你需要在一些老版本的IIRC上附加一个:utf8 。
它适用于cygwin,因为crlf图层仅在Windows上添加。 你会得到的
61 00 0A 00 62 00 0A 00 63 00 0A 00
你的编码有一个错字。 它应该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)应用,让我们知道,我们可以尝试别的。
更新: 这可能会提供你的答案 :“ BOM编码的UTF文件不适合流模型,而且它们必须是二进制文件。 ”看起来你必须以二进制读取文件,并以字符串的形式进行编码。 这可能是5.14中的一个错误。
更新2:是的,我可以确认这是一个在5.14中修复的bug 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。