【问题标题】:How to recognise encoding of the input stream automatically [csv files]如何自动识别输入流的编码 [csv 文件]
【发布时间】:2015-04-15 13:53:54
【问题描述】:

我有一组旧的 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
    #
  }
}

【问题讨论】:

    标签: perl csv utf-8 character-encoding


    【解决方案1】:

    你可以试试Encode::Detective。它可以在单行中按如下方式使用:

    perl -00 -MEncode::Detective=detect -E'open my $fh, "<", "file.csv" ; 
     my $content = <$fh>; $enc = detect ($content); say $enc'
    

    将它融入您的脚本应该不会太难。

    【讨论】:

    • 值得一提的是,无论是这种方法还是任何其他方法都不能 100% 成功找到正确的编码。
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2017-01-10
    相关资源
    最近更新 更多