在perl和double编码上打开utf8文件

时间:2014-01-22 19:32:16

标签: perl utf-8

我有mysql数据库,每个表都有COLLATE ='utf8_general_ci'。

我连接到dbi my $db = DBI->connect($cstring, $user, $password) 且没有

的表格
$db->{mysql_enable_utf8} = 1
$db->do(qq{SET NAMES 'utf8';} );

然后选择表并使用Text :: CSV将其复制到csv文件到myFile,其中myFile的打开方式如下所示:

binmode(Myfile, ":utf8")

我在不同的表上重复此过程的问题,如上所述打开的不同文件,但在某些文件上,我得到双重编码,只有当我删除这些特定文件的binmode问题解决,而其他文件很好并编码utf8,如果我删除他们的binmode我在utf8上遇到问题可能是什么问题?

值得一提的是我尝试使用:在我的脚本上使用utf8 并尝试使用

 $db-> {mysql_enable_utf8} = 1
    $db->do(qq{SET NAMES 'utf8';} );

但问题没有解决。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你会看到

éëè

您期望的地方

éëè

使用phpMyAdmin时。这表示数据库中的数据错误(双重编码)。您需要返回并使用正确的数据重新填充数据库。


如果无法修复数据库,最好只添加以下内容:

utf8::decode($str);  # Fix double-encoding

它将尝试解码数据库中已解码的数据。如果数据是双重编码的,这将解决它。如果数据没有经过双重编码,它将无法自动失败,在$str中保留正确的值(假设您的字符串不是很奇怪)。

我建议您编写一个从数据库读取数据的小工具,使用此技巧修复数据,然后将其正确地放回数据库中。