当我不知道字节顺序时,如何在Perl中解码UTF-16数据?

如果我打开一个文件(并直接指定编码):
open(my $file,"<:encoding(UTF-16)","some.file") || die "error $!\n";
while(<$file>) {
    print "$_\n";
}
close($file);

我可以很好地阅读文件内容.但是,如果我这样做:

use Encode;

open(my $file,"some.file") || die "error $!\n";
while(<$file>) {
    print decode("UTF-16",$_);
}
close($file);

我收到以下错误

UTF-16:Unrecognised BOM d at F:/Perl/lib/Encode.pm line 174

如何使其与解码一起使用?

编辑:这是前几个字节:

FF FE 3C 00 68 00 74 00

解决方法

如果您只是指定“UTF-16”,Perl将查找字节顺序标记(BOM)以找出如何解析它.如果没有BOM,它就会爆炸.在这种情况下,您必须通过为little-endian指定“UTF-16LE”或为big-endian指定“UTF-16BE”来告诉Encode您具有哪个字节顺序.

虽然你的情况还有其他的事情发生,但是如果没有看到文件中的数据,很难说清楚.我对两个片段都有同样的错误.如果我没有BOM并且我没有指定字节顺序,我的Perl就会抱怨.您使用的是哪种Perl,您拥有哪个平台?您的平台是否具有文件的本机字节顺序?根据文档,我认为我看到的行为是正确的.

此外,您不能简单地读取某些未知编码的行(无论Perl的认编码是什么),然后将其发送到解码.您可能最终处于多字节序列的中间.您必须使用Encode :: FB_QUIET来保存无法解码的缓冲区部分,并将其添加到下一个数据块:

open my($lefh),'<:raw','text-utf16.txt';

my $string;
while( $string .= <$lefh> ) {
    print decode("UTF-16LE",$string,Encode::FB_QUIET) 
    }

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...