CakePHPでデータベースの文字コードの話し

今開発しているWebサイトは、別の開発会社が別の機能を開発している。時間の関係で私がすべて開発できないので、発注元が別の開発会社を割り当てている。

その会社からの質問。

本番サーバーのDBにアクセスしたら文字コードの関係でデータが抽出できない。

そういえば、本番サーバーはTurboLinuxで文字コードがEUCだっけ。インストールされているPostgreSQLも7.x系で、テストサーバーとは違っていたような。テストサーバーは8.x。この辺りは自分がサーバーの面倒を見ている訳ではないから伝えていなかった。失敗。

PostgreSQL上にUTF-8でデータベースをcreatedbで作成しておいて、UTF-8でダンプしたSQLでリストアしておいた。システムの想定する文字コードはUTF-8。この辺りが怪しそうなので連絡しておいた。

私はCakePHPで開発していて、別の開発会社はperlのCGIで開発。CakePHPの経験がないので、perlのCGIになったようだ。

こちらは全く文字コードの意識はしていない。なにかうまく動いている。結果オーライ。apps/config/database.phpでencodingの設定もしていない。データベースが絡んだ案件は、必ず最初に文字コードでトラブルが起こる。

後から、私は非協力的だと開発会社から言われるのでしょうね。psqlコマンドで一発でわかりそうなものだが、そういえば発注元はその開発会社に、サーバーにシェルでアクセスさせる権限が与えていないかも・・・。

HTMLの特殊文字はまじめに書きましょう。

現在開発中のWebサイトはCakePHPで開発しています。今回は、PCと携帯電話の両方をサポートしています。どちらもコントローラーとアクションは共通でビューだけが異なります。携帯かどうかの判定をして、携帯電話であったらm_*.ctpという名前のビューを取り込むようにしています。

携帯電話の場合の文字コードは、基本的にシフトJISになります。通常はPHP、HTML、DBはUTF-8にしていますので、表示するときに強制的にシフトJISに文字コードを変換して、英数字カタカナを1バイト文字に変換してしまいます。この辺りはレイアウトに処理を書いておけばCakePHPだと簡単です。

ここから本題です。失敗したこと。

携帯電話の画面で矢印の代わりに<と>を使っていました。<>は2バイトコードです。例えば

<前へ 後ろへ>

のようにリンクを設定します。

しかし、お察しのとおり携帯電話のブラウザだとおかしなコードが表示されてしまいます。つまり<>がHTMLタグの始まりと終わりになって認識されてしまいます。

解決方法は簡単です。面倒がらずにHTMLの特殊文字でまじめに指定することです。<は<>は>です。これで正しく表示できます。

やはり基本は大事です。