在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',
],
}
答案 0 :(得分:10)
在使用Catalyst :: View :: TT和Catalyst :: Model :: DBIC :: Schema的典型Catalyst设置中,您需要使用UTF-8才能工作:
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 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)
on_connect_do => [ 'SET NAMES utf8' ]