Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
CakePHPと文字化け
CakePHPを入れてこれまでいろいろやってきました。日本語の文字コードについては何も考えずにやってきていたので,これをいろんな所で推奨されているようにUTF-8にしてみようと思い立ちました。
その前に現状はどうなっていたかというと,どうもShift-jisで全部やっていたみたい。(みたいなんです)
最初に文字化けしたのは,layoutを作ってそのファイルをutf-8エンコードで保存したとき。
文字化けの原因には,CakePHPだけじゃなくPHPの設定やMySQLの設定にも関係していますので,どこが原因やらわかりません。何をやっても「また化けた・・・orz」の繰り返しでした。
MySQLのデフォルトをUTF-8にするとよいのか?
my.cnfに
default-character-set = utf8
を書きまくれという指示があったのでやってみました。
phpMyAdminで見てみると,照合順序がLatinなんやらになっているのがわかりました。そこでデータベースを削除して新たに作成,デフォルトの照合順序をutf-8にしてからデータベースを作成して
php.iniをさわる
php.iniの[mbstring]セクションに
mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.encoding_translation = Off mbstring.detect_order = auto
かわらなかった。
database.phpにエンコードのパラメータを記述する
var $default = array('driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'time_card', 'encoding' => 'utf8', 'prefix' => '');
これは効いたみたい。
そして,default.thtmlに次の行を追加
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
これで文字化け解消しました。でも本当はここは,CakePHP的にはヘルパーを使って次のようにするべきなのですね。
<?php echo $html->charset("utf-8");?>
なんだか,いろいろなことをやり過ぎて,本当はしなくても良いことまでやったのかもしれません。また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はインストールしたときのまま何もさわっていませんが,文字化けせずに使用できています。