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