首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF-16 perl输入输出

UTF-16 perl输入输出
EN

Stack Overflow用户
提问于 2012-10-28 08:27:19
回答 2查看 2.4K关注 0票数 4

我正在编写一个脚本,它将UTF-16编码的文本文件作为输入,并输出一个UTF-16编码的文本文件。

代码语言:javascript
复制
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中的每一行都以疯狂的符号作为前缀。

例如:

代码语言:javascript
复制
<FIRST LINE OF TEXT>
਀    ㈀  ㄀Ⰰ ㈀Ⰰ 嘀愀 ㌀ 䌀栀椀愀 䐀⸀⸀⸀  儀甀愀渀最 䠀ഊ<SECOND LINE OF TEXT>
...

有没有人能解释一下为什么它可以在cygwin上运行,但不能在windows上运行?

编辑:按照建议打印编码层后。

在Windows环境中:

代码语言:javascript
复制
unix
crlf
encoding(UTF-16)
utf8
unix
crlf
encoding(UTF-16)
utf8

在Cygwin环境中:

代码语言:javascript
复制
unix
perlio
encoding(UTF-16)
utf8
unix
perlio
encoding(UTF-16)
utf8

唯一的区别是perlio层和crlf层。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-28 15:00:42

我本打算等待并给出一个彻底的答案,但我给你一个快速的答案可能比什么都没有要好。

问题是crlfencoding层的顺序错误。不是你的错。

例如,假设您使用UTF-16le执行print "a\nb\nc\n"; (因为它更简单,而且可能正是您真正想要的)。你最终会得到

代码语言:javascript
复制
61 00 0D 0A 00 62 00 0D 0A 00 63 00 0D 0A 00

而不是

代码语言:javascript
复制
61 00 0D 00 0A 00 62 00 0D 00 0A 00 63 00 0D 00 0A 00

我不认为您可以使用open杂注或binmode获得正确的结果,但可以使用open来完成。

代码语言:javascript
复制
open(my $fh, '<:raw:encoding(UTF-16):crlf', $qfn)

您将需要附加一个带有较旧版本的:utf8

它可以在cygwin上运行,因为crlf层只在Windows上添加。这样你就会得到

代码语言:javascript
复制
61 00 0A 00 62 00 0A 00 63 00 0A 00
票数 5
EN

Stack Overflow用户

发布于 2012-10-28 08:54:02

您的编码中有一个拼写错误。它应该是use open ":encoding(UTF-16)"注意冒号。我不知道为什么它可以在Cygwin上工作,但不能在Windows上工作,但也可能是5.12和5.14之间的事情。Perl似乎弥补了这一点,但它可能是导致您的问题的原因。

如果这不起作用,请检查编码是否应用于您的文件句柄。

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13105361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档