通常、DBの設計の際には、照合順序をUTF-8にしておけば何の問題もないと思っていたのだが、CPIというレンタルサーバのDBを扱う際、照合順序も全部ちゃんとUTF-8にしているのに、文字化けが直らないという問題が発生した。原因が全く分からずに、かなりの時間、悪戦苦闘した。正確にいうと、悪戦苦闘していたのは僕じゃなくて先輩プログラマーのヅヤさんがですけど。
で、原因を調べているうちに我流天性さんというサイトに行き当たり、その解決法も書いてあったので参考にさせてもらった。
どうやらあそこは、文字コードのデフォルトの設定がEUC-JPになっているようなので、これをUTF-8に直す必要があるらしい。
それにはまず、CPIのコントロールパネルにあるお客様情報のPHP iniの設定情報の中から、自分の使っているPHPのバージョンと同じphp.iniの情報を表示させ、それをまるごとテキストエディタにコピーする。コピーしたテキストを追っていくとのず~っと下の方に(1170行目あたりかな)こんなようなことが書いてある部分がある。
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
これを以下のように書き換える。
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.encoding_translation = Off
mbstring.http_output = pass
mbstring.detect_order = auto
これをphp.iniという名前で保存して、FTPでアップロードする。場所は我流天性さんに倣って、secureというディレクトリの中に一つ適当なディレクトリを作成して、そこにアップ。
アップできたら、今度は.htaccessというファイルを作成して、以下の文を書く。
suPHP_ConfigPath /usr/home/ユーザーID/secure/作成したディレクトリ/
CakePHPを使っている場合は、webrootディレクトリの中にすでに.htaccessがあるので、そこにでも書き加えてやればいい。
・・・と、こんな感じで文字化け解消の手続きをしたわけなんですが、しかし僕の場合は一向に文字化けが解決しなかった。もともとCPIとかいうレンタルサーバのことはよく分からない上、これ以上の解決策も全く知らなかったので、悪戦苦闘する以外にはどうにもならなかった。
そして最終的に出た結論。
CakePHPではデータベースへの接続を行う際、database.phpにいろいろと書くわけですが
class DATABASE_DONFIG {
var $default = array(
'driver' => 'mysql';
・・・中略・・・
'encoding' => 'utf-8' ←ここ
}
このencodingの部分。一見何の問題もないように見えるけど、実はハイフンを入れて書くのはNGらしい。正しくはutf8と表記しなければならない。初めて知ったよ、そんなこと。
ここを直したら、文字化けも無事に解消しました。でもそのかわりにヅヤ先輩の仕事時間を大幅に奪ってしまいました。さーせん。
しかし、今まではutf-8と書いても文字化けせずに普通に動作していたのだけど、それはどうしてなんだろう。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。