如何在Catalyst应用程序中正确使用Schema中的UTF-8编码数据?

时间:2012-10-30 12:11:13

标签: perl utf-8 catalyst dbix-class

在Catalyst应用程序或模板中定义的数据具有正确的编码并且显示良好,但是从数据库中,非Latin1的所有内容都转换为?。我认为问题应该在模型类中,就是这样:

use strict;
use base 'Catalyst::Model::DBIC::Schema';

__PACKAGE__->config(
 schema_class => 'vhinnad::Schema::DB',

 connect_info => {
     dsn => 'dbi:mysql:test',
     user => 'user',
     password => 'password',
     {
         AutoCommit        => 1,
         RaiseError        => 1,
         mysql_enable_utf8 => 1,
     },
     'on_connect_do' => [
             'SET NAMES utf8',
     ],      
     }
);

1;

我看到这里没有任何瑕疵,但有些事情一定是错的。我使用我的架构也测试脚本和数据编码良好,输出正确,但在Catalyst应用程序内我没有得到正确的编码。哪里可能是问题?

修改

为了将来的参考,我把解决方案放在这里:我混合了连接信息的新旧风格。

旧样式就像(dsn, username, passw, hashref_options, hashref_other options)

新样式为(dsn => dsn, username => username, etc),所以正确使用:

 connect_info => {
     dsn               => 'dbi:mysql:test',
     user              => 'user',
     password          => 'password',
     AutoCommit        => 1,
     RaiseError        => 1,
     mysql_enable_utf8 => 1,
     on_connect_do     => [
             'SET NAMES utf8',
     ],      
 }

2 个答案:

答案 0 :(得分:10)

在使用Catalyst :: View :: TT和Catalyst :: Model :: DBIC :: Schema的典型Catalyst设置中,您需要使用UTF-8才能工作:

  • 将Catalyst :: Plugin :: Unicode :: Encoding添加到您的Catalyst应用程序
  • encoding => 'UTF-8'添加到您的应用配置
  • ENCODING => 'utf-8'添加到您的TT视图配置
  • <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>添加到html的<head>部分,以满足不关心Catalyst :: Plugin :: Unicode :: Encoding设置的Content-Type:text/html; charset=utf-8 http标头的旧IE
  • 确保文本编辑器将模板保存为UTF-8(如果它们包含非ASCII字符
  • 根据DBIx::Class::Manual::Cookbook#Using Unicode
  • 配置您的DBIC模型
  • 如果使用Catalyst :: Authentication :: Store :: LDAP,请通过添加ldap_server_options => { raw => 'dn' }来配置LDAP存储以返回UTF-8

根据Catalyst::Model::DBIC::Schema#connect_info

支持DBI的hashrefs的旧arrayref样式,然后支持DBIx :: Class选项。

但是你已经在使用'new'样式了,所以你不应该嵌套dbi属性:

connect_info => {
     dsn               => 'dbi:mysql:test',
     user              => 'user',
     password          => 'password',
     AutoCommit        => 1,
     RaiseError        => 1,
     mysql_enable_utf8 => 1,
     on_connect_do     => [
         'SET NAMES utf8',
     ],      
}

答案 1 :(得分:1)

此建议假设您拥有相当最新版本的DBICCatalyst

      
  • 这不是必需的:on_connect_do => [ 'SET NAMES utf8' ]
  •   
  • 确保数据库中的表|列字符集是UTF-8。即使部件损坏,您也可以实现有时看起来正确的事物。如果您希望整个链工作,则DB必须将字符数据保存为UTF-8。
  •   
  • 确保您在Catalyst应用中使用和配置Catalyst::Plugin::Unicode::Encoding。它确实在不太遥远的过去有严重的错误,所以得到最新的。