如何自动识别输入流的编码方式 [CSV 文件]

3
我有一组旧的CSV文件,它们使用不兼容的编码方式创建,包括utf-8和iso 8859-2。现在我正在将它们导入数据库,当然,我希望像“krzesło”这样的单词被正确识别,而不管原始编码如何。如果它们都是utf文件,那么就很简单:我已经找到了Text::CSV和Text::CSV::Encoded模块,对于utf文件,它们都可以轻松处理。
问题在于,一些文件使用8859-2 8位编码,如果我尝试盲目地用其utf表示替换字符,可能会破坏utf编码,如果该行已经编码为utf。
我考虑在文件级别上识别编码并在导入之前转换文件,但这些文件不属于我,我仍然会收到新数据,并且我不确定未来的文件是否都是utf编码。
我的程序的一般算法如下:
use utf8;
use Encode qw(encode decode);
use open ':std', ':encoding(UTF-8)';

my $csv = Text::CSV::Encoded->new ( 
{ 
  encoding_in      => "utf8", 
  encoding_out     => "utf8",  
  binary        => 0,
  sep_char      => ';',
  eol       => $/ 
} )  # should set binary attribute.
            or die "Cannot use CSV: ".Text::CSV->error_diag ();

while (<>) {
  if ($_ not in utf) { convert $_ to utf }
  if ($csv->parse($_)) {
    #
    # further field-level processing
    #
  }
}
1个回答

2
你可以尝试使用Encode::Detective。在一行命令中,可以这样使用它:
perl -00 -MEncode::Detective=detect -E'open my $fh, "<", "file.csv" ; 
 my $content = <$fh>; $enc = detect ($content); say $enc'

这应该不难将其融入你的脚本中。

3
值得一提的是,无论是这种方法还是任何其他方法都无法百分之百地成功地找到正确的编码方式。 - Neil Slater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接