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

w.k*_*w.k 6 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;
Run Code Online (Sandbox Code Playgroud)

我看到这里没有瑕疵,但有些事情一定是错的.我使用我的架构也测试脚本和数据编码良好,输出正确,但在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',
     ],      
 }
Run Code Online (Sandbox Code Playgroud)

Ale*_*ier 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"/><head>html 的部分以满足不关心Content-Type:text/html; charset=utf-8Catalyst :: Plugin :: Unicode :: Encoding设置的http头的旧IE
  • 确保文本编辑器将模板保存为UTF-8(如果它们包含非ASCII字符)
  • 根据DBIx :: Class :: Manual :: Cookbook#使用Unicode配置DBIC模型
  • 如果您使用Catalyst :: Authentication :: Store :: LDAP,请将LDAP存储配置为通过添加返回UTF-8 ldap_server_options => { raw => 'dn' }

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

还支持旧的arrayref样式,其中包含DBI的hashrefs,然后是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',
     ],      
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以跳过Catalyst 5.90040以来的Unicode :: Encoding插件; 该插件现在包含在Catalyst的核心中. (2认同)