【发布时间】: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