Perl 获取从文件读取的字符串的编码

Perl 获取从文件读取的字符串的编码,perl,powershell,encoding,Perl,Powershell,Encoding,我正在尝试将perl脚本转换为powershell脚本。当脚本读取日志文件并且必须获取文件的编码时,我遇到了部分问题 以下是perl代码: sub get_encoding { my $f = shift; my $fh; return "ASCII" if (!open ($fh,"<",$f)); my $b = ""; my $n = read ($fh,$b,2); close ($fh); return "UTF-16" if ($b eq "\x{ff}\x{fe}"); re

我正在尝试将perl脚本转换为powershell脚本。当脚本读取日志文件并且必须获取文件的编码时,我遇到了部分问题

以下是perl代码:

sub get_encoding {
my $f = shift;
my $fh;
return "ASCII" if (!open ($fh,"<",$f));
my $b = "";
my $n = read ($fh,$b,2);
close ($fh);
return "UTF-16" if ($b eq "\x{ff}\x{fe}");
return "ASCII";
}
其中$l->{file}是日志文件的路径

有人能解释一下发生了什么,特别是在这一行:

return "UTF-16" if ($b eq "\x{ff}\x{fe}");
如果有人知道在powershell中实现这一点的好方法,那么任何提示都值得一提

吉斯利

来自


脚本从$f:
my$n=read($fh,$b,2)将之前的两个字节读入$b

该行测试这两个字节是否为FF和FE

我猜FF,FE是UTF-16小端编码的字节顺序标记
请参见此处

脚本先前从$f:
my$n=read($fh,$b,2)将两个字节读入$b

该行测试这两个字节是否为FF和FE

我猜FF,FE是UTF-16小端编码的字节顺序标记
请参见此处

程序读取并检查给定文件的前2个字节,以决定是否应返回字符串“ASCII”或“UTF-16”

以下是一些更详细的说明:

如果文件由于任何原因无法打开,它将返回“ASCII”。(奇怪,但它就是这么做的。)

文件句柄
$fh
在读取后立即被
关闭
ed

close ($fh);
如果
$b
的值正好是“\x{ff}\x{fe}”,则返回“UTF-16”。虽然返回“UTF-16BE”更准确
\x{..}
是字节的十六进制值表示形式。因此,
“\x{ff}\x{fe}”
中有两个字节,而不是10或12

return "UTF-16" if ($b eq "\x{ff}\x{fe}");
最后,如果
$b
不等于“\x{ff}\x{fe}”,则返回ASCII

return "ASCII";

程序读取并检查给定文件的前2个字节,以决定是否返回字符串“ASCII”或“UTF-16”

以下是一些更详细的说明:

如果文件由于任何原因无法打开,它将返回“ASCII”。(奇怪,但它就是这么做的。)

文件句柄
$fh
在读取后立即被
关闭
ed

close ($fh);
如果
$b
的值正好是“\x{ff}\x{fe}”,则返回“UTF-16”。虽然返回“UTF-16BE”更准确
\x{..}
是字节的十六进制值表示形式。因此,
“\x{ff}\x{fe}”
中有两个字节,而不是10或12

return "UTF-16" if ($b eq "\x{ff}\x{fe}");
最后,如果
$b
不等于“\x{ff}\x{fe}”,则返回ASCII

return "ASCII";

这句话在我看来真像个虫子。我认为应该阅读
返回“UTF-16”if($b eq“\xFF\xFE”)-即:它应该将从文件读入的字节与字节字符串(而不是字符串)进行比较<代码>“\xE9”
是一个包含单字节0xE9的字节字符串
“\x{E9}”
是一个字符串,其中包含Unicode代码点0+00E9处的字符。在我看来,该行实际上像一个bug。我认为应该阅读
返回“UTF-16”if($b eq“\xFF\xFE”)-即:它应该将从文件读入的字节与字节字符串(而不是字符串)进行比较<代码>“\xE9”
是一个包含单字节0xE9的字节字符串
“\x{E9}”
是一个字符串,包含Unicode代码点0+00E9处的字符。表示Unicode不准确的部分,因为它是一个字符集,而不是编码。代码应区分UTF-16BE和UTF-16LE。请修复。与UTF-8相关的部分有点不正确,因为UTF-8不需要字节顺序标记(这是一个字节序列;尽管可能会对其进行编码以将其标记为UTF-8)。最后,UTF-8被设计成可以与ASCII交换,如果没有使用U+007f以外的字符。@daxim&sstn请参阅我答案中的链接,这里有一个更准确的脚本。这不是我厨房里的汤,而是一个更好的准确脚本的良好起点感谢所有的评论。有没有更简单的方法来检查这一点。我可以通过读取两个字节并像在perl脚本中一样检查它们来进行检查吗?它说Unicode不准确,因为它是一个字符集,而不是编码。代码应区分UTF-16BE和UTF-16LE。请修复。与UTF-8相关的部分有点不正确,因为UTF-8不需要字节顺序标记(这是一个字节序列;尽管可能会对其进行编码以将其标记为UTF-8)。最后,UTF-8被设计成可以与ASCII交换,如果没有使用U+007f以外的字符。@daxim&sstn请参阅我答案中的链接,这里有一个更准确的脚本。这不是我厨房里的汤,而是一个更好的准确脚本的良好起点感谢所有的评论。有没有更简单的方法来检查这一点。我可以通过读取两个字节并像在perl脚本中一样检查它们来进行检查吗?
return "ASCII";