過去のエントリ CakePHPと文字化け において
なんだか,いろいろなことをやり過ぎて,本当はしなくても良いことまでやったのかもしれません。またdbに記録する文字コード体系と,表示の文字コード体系が違うものではいけないのかなど,不明な点が多くあります。文字コードについては今後も研究課題にしたいと思います。
と研究課題にすることにしたのですが,今回文字化け解消の方法を再度実験してみました。MySQLの4.1以降では文字コードの自動変換機能が実装され,逆にそのために文字化けに悩まされることが多くなったとの情報を得ました。また,PHPの文字コードの扱いについても色々と調べてみました。
参考サイト
- MySQLリファレンス - 24.4.4.4. 文字セットと Unicode の使用
- 【MySQLウォッチ】第36回 文字化けのメカニズム ITPro
- PHPの文字化けを本気で解決する ぎじゅっやさん
サイトで使用するエンコードを決定する
CakePHPシステムの中でどのエンコードを使用するのかを決定します。MySQLのテーブルにどのエンコードでデータが格納されているかは,この際あまり問題ではないようです。サイト内で利用されているエンコードと,MySQLに接続するときのクライアント文字セットが一致していればいいようです。今回はこのテストをするに当たり,文字セットがEUC-JP,Shift-JIS,UTF-8の3種類のフィールドを持つテーブルを作って,そのテーブルにデータの追加,編集を行うCakePHPコントローラを作成してテストしました。
ファイルのエンコードを揃える
特にビューファイル(default.thtmlを含むthtmlファイル)に日本語を含む場合のファイルのエンコードはすべて決定したエンコードを使用します。Eclipseを使用している場合は,ワークスペースのエンコードを指定しておきます。 (Eclipseではeuc-jpとかは指定できないみたいですが)
これがばらばらですと,ビューの表示内容が部分的に(あるいは全体に)文字化けしたりします。
レイアウトでエンコードを指定する
dafault.thmlなどのLayoutファイルではhead部分に$html->chasetメソッドを使って決定したエンコードを指定します。
<?php echo $html->charset("utf-8");?>
ページのエンコードをこのようにちゃんと指定していれば,ブラウザがエンコードを間違えることもありません。
データベースのクライアント・エンコードを指定する
MySQLのSET NAMES でクライアントのエンコードをサイトのエンコードと一致させる必要があります。CakePHPではdatabase.phpに,encodingオプションを追加することでエンコードをセットすることができます。この機能を使って決定したエンコードを指定します。
var $default = array('driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'encodetest', 'encoding' => 'utf8', 'prefix' => '');
ここで指定するエンコードの表記方法は,MySQLの文字セット名です。EUC-JPはujis,shift-jisはsjis,utf-8はutf8となります。僕は,ここで間違ってutf-8と指定して文字化けが解消せずにハマりました。(´・ω・`) バカですた。
しかし,SET NAMESは禁止というような話も聞くのですが,CakePHPではこれを使っているような気がするのですが,いいのかな。
とりあえず結論
これら3つのエンコードを揃えておけば文字化けはしないようです。EUC-JPとUTF-8で確認しました。Shift-JISではチェックしていませんが,いけるんと違いますやろか。ただし僕はEclipseを使っている関係で,サイトのエンコードはUTF-8がお勧めだと思っています。php.iniやmy.cnfはインストールしたときのまま何もさわっていませんが,文字化けせずに使用できています。