【问题标题】:opening utf8 files on perl and double encoding在 perl 和双重编码上打开 utf8 文件
【发布时间】: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 所说的不正确。

标签: perl utf-8


【解决方案1】:

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

éëè

你期望的地方

éëè

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


如果您无法修复您的数据库,则添加以下内容很可能是安全的:

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

它将尝试从数据库中解码已经解码的数据。如果数据是双重编码的,这将修复它。如果数据没有被双重编码,它会默默地失败,在$str 中留下正确的值(假设你的字符串不是很奇怪)。

我建议你写一个从数据库中读取数据的小工具,使用这个技巧来修复数据,然后正确的放回数据库中。

【讨论】:

  • 感谢答案,如果我需要再次使用 DBI 填充我的数据并且数据本身是 utf8,我应该如何配置 dbi?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 2014-02-16
  • 2012-04-27
  • 2010-11-13
  • 2012-10-20
  • 2012-09-04
  • 1970-01-01
相关资源
最近更新 更多