user icon

UTF-8なCakePHP+EUC-JPなMySQL4.0

CakePHPは非常に良くできたPHPフレームワークです。
DBの種類等も設定ファイルに少し書いてやるだけで動いてくれます。

文字コードもそうで下記設定ファイルに書くだけです。
MySQLでEUC-JPを扱う場合も下記のようにするだけです。

/app/config/database.php
<!--?php
class DATABASE_CONFIG {

    var $default = array(
        &#039;driver&#039; =--> 'mysql',
        'persistent' =&gt; false,
        'host' =&gt; 'localhost',
        'port'=&gt;3306,
        'database' =&gt; 'dbname',
        'login' =&gt; 'dbuser',
        'password' =&gt; 'dbpassword',
        'prefix' =&gt; '',
        'encoding' =&gt; 'ujis',
    );

}
?&gt;

MySQLの場合はここで設定したencodingを使って、「SET NAMES ujis;」を自動的に発行してくれています。ここで問題が発生したのですが、MySQL4.0系にはSET NAMES構文がないので文字化けしてしまいます。CakePHP側もEUC-JPにしてしまえばいいのですが、今回はUTF-8である必要があり、DBとの入出力の際に、UTF-8⇔EUC-JPと変換することにしました。CakePHPはデータ操作の際に呼ばれるコールバック関数がありますので、そこで変換してやればOKです。

基本的に全ての生成されたModelはAppModelクラスを継承していますので、このクラスで変換してやります。

/app/config/app_model.php
<!--?php
class AppModel extends Model {

    //データ取得後に呼ばれるコールバック関数
    function afterFind($results) {
        //$results配列をUTF-8に変換する処理
        
        return $results;
    }

    //データ保存前に呼ばれるコールバック関数    
    function beforeSave() {
        //$this--->data配列をEUC-JPに変換する処理

        return true;
    }
}
?&gt;

もっと根っこのところで変換かけても良いのでしょうが、今回はCakePHPのライブラリには手を加えたくなかったので、こうしました。子クラスで上記関数をオーバーライドしている場合は親の関数を呼ぶのをお忘れなく。こうしたほうが良いというのがあればツッコミお待ちしてます。

Facebooktwitterlinkedintumblrmail

タグ:

コメントは受け付けていません。