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 ビュー設定に追加します
  • Catalyst::Plugin::Unicode::Encoding によって設定された http ヘッダーを気にしない古い IE を満たすために、html のセクションに追加<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>します。<head>Content-Type:text/html; charset=utf-8
  • 非 ASCII 文字が含まれている場合は、テキスト エディターがテンプレートを UTF-8 で保存していることを確認してください。
  • DBIx::Class::Manual::Cookbook#Using Unicodeに従って DBIC モデルを設定します
  • Catalyst::Authentication::Store::LDAP を使用する場合は、LDAP ストアを追加して UTF-8 を返すように構成します。ldap_server_options => { raw => 'dn' }

Catalyst::Model::DBIC::Schema#connect_infoによると:

DBI と DBIx::Class オプションの hashref を持つ古い arrayref スタイルもサポートされています。

ただし、すでに「新しい」スタイルを使用しているため、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' ]
  • テーブル|列の文字セットがDBでUTF-8であることを確認してください。部品が壊れていても、時には正しいように見えるものを実現できます。チェーン全体が機能すると予想される場合、DB は文字データを UTF-8 として保存する必要があります。
  • Catalyst アプリでCatalyst::Plugin::Unicode::Encodingを使用して構成していることを確認してください。それほど遠くない過去に重大なバグがあったため、最新のものを入手してください。
于 2012-10-30T16:59:49.230 に答える