【发布时间】:2014-01-22 19:32:15
【问题描述】:
我有 mysql db,每个表都有 COLLATE='utf8_general_ci'。
我使用 dbi my $db = DBI->connect($cstring, $user, $password) 和不使用 dbi 连接到表
$db->{mysql_enable_utf8} = 1
$db->do(qq{SET NAMES 'utf8';} );
然后选择表格并使用 Text::CSV to myFile 将其复制到 csv 文件,其中 myFile 如下所示:
binmode(Myfile, ":utf8")
问题是我在不同的表上重复这个过程,不同的文件像上面一样打开,但是在某些文件上我得到双重编码,只有当我删除那些特定文件的 binmode 时,问题才解决,而其他文件很好并编码 utf8,如果我为他们删除 binmode,我会在 utf8 上遇到问题,这可能是什么问题?
值得一提的是,我尝试在我的脚本上使用:use utf8,并且还尝试使用
$db-> {mysql_enable_utf8} = 1
$db->do(qq{SET NAMES 'utf8';} );
但问题没有解决。
【问题讨论】:
-
当你使用binmode
:utf8配置文件时,你需要确保你输入的字符串是utf8::is_utf8,因为如果不是,它们将从iso-8859-1解码并以 utf8 编码,导致双重编码。您必须自己配置连接以返回正确标记为 utf-8 或utf8::decode的字符串。 -
或者你可以不用binmode;那么它不应该修改编码。
-
您确定问题不在于某些数据库表包含双编码值吗? (即您描述的问题可能发生在输入或输出上。)
-
在配置 binmode 时如何让我输入的字符串是 utf8::is_utf8 谢谢
-
永远不要使用
is_utf8。绝不。它只是一个调试工具。 Jan Hudec 所说的不正确。