Perl和MySql中的UTF8编码

15

我的数据库(MySql)具有utf8_general排序规则。我正在从数据库访问数据并显示一个网页(使用Perl开发),但它显示出不同的字符来代替瑞典语字符(ä、å、ö)。我在Mysql数据库中检查了数据,那里我可以看到带有ä、å、ö字符的数据。似乎在访问数据时存在编码问题。连接到数据库时,使用以下代码:

my($dbh) = DBI->connect($config{'dbDriver'},$config{'dbUser'},$config{'dbPass'}) or die "Kunde inte ansluta till $config{'dataSource'}: " . $DBI::errstr;
$dbh->{'mysql_enable_utf8'} = 1;
$dbh->do('set names utf8');

“访问该数据时出现问题”并不足以描述这个问题。 - ikegami
我的意思是,在访问数据时存在一些编码问题。我也更新了我的问题。 - dotnetrocks
它是如何显示这些字符的?你的网页使用的是哪种编码? - Pekka
我在网页中使用utf8。 "use encoding qw(utf8); use open qw(:std); use Encode qw/is_utf8 decode/; " 但是字符显示为"������?"。 - dotnetrocks
1
那么,您确实从数据库中以错误的格式获取数据(可能是ISO-8859-1)。 - Pekka
显示剩余2条评论
4个回答

10

你需要在连接上设置 mysql_enable_utf8

 my($dbh) = DBI->connect(
     'dbi:mysql:test',
     'user',
     'password',
     {
         mysql_enable_utf8 => 1,
     }      
);

嗨,谢谢。我尝试了mysql_enable_utf8 => 1,但问题没有解决。 - dotnetrocks
2
@dotnetrocks: 它解决了你在问题中提到的问题。如果您在网页编码方面遇到问题,应该注意IO和适当的标头。 - w.k

9
如果每个ä/å/ö都是由两个字节表示在输出中,那么你可能会双重编码字符。(考虑到问题已经显示了 $dbh->{'mysql_enable_utf8'} = 1;,我怀疑这是最有可能的情况。)另一个可能性是,在您显示此内容的网页上,页面可能没有指定字符集为UTF-8,浏览器可能会错误地猜测所使用的字符编码。
仔细检查您的Web应用程序框架、模板系统等,确保在从数据库检索到数据到达用户浏览器之间,值只被编码一次。许多框架/模板引擎(如我通常使用的Dancer和TT组合)将自动处理输出编码,如果您正确配置它们,这意味着数据将在显式编码之前被双重编码。

1
我进行了两次编码。我将其删除后现在可以工作了!!非常感谢!! :) - dotnetrocks

0

0

您需要在连接中设置字符集为 utf8!

charset = utf8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接