gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:56:36 25 4
gpt4 key购买 nike

如果我打开一个文件(并直接指定编码):

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

我怎样才能让它与 decode 一起使用?

编辑:这里是前几个字节:
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,您使用的是哪个平台?您的平台是否具有文件的 native 字节序?根据文档,我认为我看到的行为是正确的。

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

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

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

关于perl - 当我不知道字节顺序时,如何在 Perl 中解码 UTF-16 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2887868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com