仕事でPHP4.4.x+MySQL4.1.X+Ethna2.3.2で文字コードはUTF-8という環境でシステムを作ることに。
結構苦労したのでメモ。
■UTF-8について
なんとなくオシャレだなとは思っていたのですが、EthnaがEUC-JPがデフォルトなので特にUTF-8で作りたいとは思っていませんでした。
が、Javascriptを絡ませようとするとUTF-8の方が使い勝手が良いので、敵に回した時にどっちがやっかいかなと考えた時に、経験不足のJavascriptってことになりました。
あと、のちのち全文検索する可能性もあったので、以下のサイトを参考にしたいってのもありました。
MySQL FULLTEXT + Ngram : LIKE検索より数十倍高速な、お手軽 日本語全文検索 について|blog|たたみラボ
■PHP
htaccessファイルに以下の記入して設置。
ActionFormのfilter周りがinternal_encodingを見ているので。
php_value mbstring.language "Japanese"
php_value mbstring.internal_encoding "UTF-8"
■EthnaのUTF-8化
皆さん考えることは同じなようで、たくさんのページが出てきましたが結局ここを参考にしました。
ずんWiki - PHP/Ethna/UTF-8化
デバッグ時のPHPの内部エラーメッセージもUTF-8化するには以下のサイトを参考にEthna.phpを触ります。
エラーメッセージがEUC-JPで書かれているのでそれをUTF-8で送るようにする。
※2007/9/20追記
上記参考サイトの二つを適用すると、アクションフォームでのエラーメッセージが一部文字化けするという事態が発生します。
で、Ethna.phpで追加する一文を以下のように変更すると直ります。
- $message = mb_convert_encoding($message, 'UTF-8', 'EUC-JP');
+ $message = mb_convert_encoding($message, 'UTF-8', 'UTF-8,EUC-JP');
あと、以下のファイルも変更しておくと文字化けしません。
@Ethna/tpl/unittest.tpl
@Ethna/tpl/info.tpl
charset=EUC-JP
↓
charset=UTF-8
■MySQL4.1
一番怖かったのがMySQL4.1系。
あまりの怖さに手を出したくなかったのですが、こればっかりはしょうがないです。
ますは、以下のサイトを参考にMySQLを設定。
MySQL4.1系UTF-8の場合 - phpspot
あと、環境は違いますがphpMyAdmin使っていたので、以下のサイトも参考になりました。
artful xampp:Mysqlに関するPHPMyAdminの文字化け
あとはEthnaの方でAppObjectを使っていたので、以下のサイトを参考にSET NAMES utf8をセット。
GRANADA Hatena - EthnaでAppObjectを使うときデータベースの文字コードを指定する
※2007/09/20追記
getObject('Hoge', 'hogeid', '1111')
みたいにgetObjectと同時に引数で値を取得する際に文字化け発覚。
親のコンストラクタでセットしちゃってるみたいなので、子のコンストラクタへ親のコンストラクタを丸ごと持ってきて、以下のように2行追加。
$this->my_db_rw =& $db_list['rw'];
$this->my_db_ro =& $db_list['ro'];
// XXX: app objはdb typeを知らなくても動くべき
$this->my_db_type = $this->my_db_rw->getType();
+ // utf-8対応
+ $this->db->query("SET NAMES utf8");
いやあ、大変だ。。。