6

在 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',
     ],      
 }
4

2 回答 2

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-8由 Catalyst::Plugin::Unicode::Encoding 设置的 http 标头的旧 IE
  • 如果模板包含非 ASCII 字符,请确保您的文本编辑器将模板保存为 UTF-8
  • 根据DBIx::Class::Manual::Cookbook#Using Unicode配置您的 DBIC 模型
  • 如果您使用 Catalyst::Authentication::Store::LDAP 配置您的 LDAP 存储以通过添加返回 UTF-8ldap_server_options => { raw => 'dn' }

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

旧的 arrayref 样式与 DBI 的 hashrefs 和 DBIx::Class 选项也受支持。

但是您已经在使用“新”样式,因此不应嵌套 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',
     ],      
}
于 2012-10-30T21:18:13.417 回答
1

此建议假定您拥有最新版本的DBICCatalyst

  • 这不是必需的:on_connect_do => [ 'SET NAMES utf8' ]
  • 确保数据库中的表|列字符集是 UTF-8。即使零件损坏,您也可以实现有时看起来正确的事情。如果您希望整个链正常工作,数据库必须将字符数据保存为 UTF-8。
  • 确保您在 Catalyst 应用程序中使用和配置Catalyst::Plugin::Unicode::Encoding。它在不久的过去确实有严重的错误,所以获取最新的。
于 2012-10-30T16:59:49.230 回答