all*_*hou 4 windows io perl cygwin utf-16
我正在编写一个脚本,它将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"
}
Run Code Online (Sandbox Code Playgroud)
我们只说我的程序将input.txt中的所有内容写入output.txt.
这在我的cygwin环境中完全正常,它使用"这是为cygwin-thread-multi-64int构建的perl 5,版本14,颠覆2(v5.14.2)"
但在我的Windows环境中,使用"这是为MSWin32-x64多线程构建的perl 5,版本12,颠覆3(v5.12.3)",
output.txt中的每一行都预先设置了除第一行之外的疯狂符号.
例如:
<FIRST LINE OF TEXT>
???????????????????????????????????????<SECOND LINE OF TEXT>
...
Run Code Online (Sandbox Code Playgroud)
任何人都可以提供一些有关它为什么在cygwin而不是Windows上工作的见解?
编辑:按照建议打印编码图层.
在Windows环境中:
unix
crlf
encoding(UTF-16)
utf8
unix
crlf
encoding(UTF-16)
utf8
Run Code Online (Sandbox Code Playgroud)
在Cygwin环境中:
unix
perlio
encoding(UTF-16)
utf8
unix
perlio
encoding(UTF-16)
utf8
Run Code Online (Sandbox Code Playgroud)
唯一的区别是perlio和crlf层之间.
[我本来打算等待并给出一个彻底的答案,但如果我给你一个快速回答而不是什么,那可能会更好.]
问题是,crlf
和encoding
层顺序错误.不是你的错.
例如,假设你print "a\nb\nc\n";
使用UTF-16le(因为它更简单,它可能是你真正想要的).你最终会
61 00 0D 0A 00 62 00 0D 0A 00 63 00 0D 0A 00
Run Code Online (Sandbox Code Playgroud)
代替
61 00 0D 00 0A 00 62 00 0D 00 0A 00 63 00 0D 00 0A 00
Run Code Online (Sandbox Code Playgroud)
我不认为你可以用open
pragma或者得到正确的结果binmode
,但可以使用open
.
open(my $fh, '<:raw:encoding(UTF-16):crlf', $qfn)
Run Code Online (Sandbox Code Playgroud)
您需要附加:utf8
一些旧版本IIRC.
它适用于cygwin,因为该crlf
层仅在Windows上添加.你会得到的
61 00 0A 00 62 00 0A 00 63 00 0A 00
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2222 次 |
最近记录: |