カテゴリー : 2012年 2月

cake2.0系で携帯サイト対応する方法(文字化け対応)

携帯サイトを作成するとき、エンコードをSJISにする必要があるが、cakeのデフォルトエンコードはUTF-8なので、いくつか対応してあげないと文字化けする。
cake1.x系だと、下記の方法でいけそう。

[CakePHP] 携帯サイトの作り方まとめ by Sometime PHP様 

でもcake2.0になると、afterFilter() の中で、下記のように記述するという方法がそもそも使えない。

$this->output = mb_convert_kana($this->output, ‘rak’);
$this->output = mb_convert_encoding($this->output, ‘SJIS-win’, ‘UTF-8’);
…..

→$this->outputが使われなくなってしまっているため。
ちょっとソースをみてみたら、下記の方法でできそう。

$this->response->body(mb_convert_encoding($this->response->body(), ‘SJIS-win’, ‘UTF-8’));

$this->response (CakeResponseクラス)のbody関数は、引数が設定されていた場合は引数の値をbodyにセットし、引数が無い場合は今もっているbodyを返す。

と、これでテストしてみたらどうもまだ文字化けする。HTMLはSJISで渡っているものの、ブラウザがUTF8として処理をしてしまっている。
もちろん、HTML内でcharsetの設定はしている。
HTTP-HEADERをみてみると、ヘッダーでcharsetをUTF-8として送信しているよう。

今度はCakeResponse.phpをみてみたら、CakeResponseに対してcharsetの指定をしてあげないといけないらしい。
これをしないと、core.phpで指定した下記の値が引き継がれる。

Configure::write(‘App.encoding’, ‘UTF-8’);

ということで、下記にて一件落着。

function afterFilter() {
parent::afterFilter();
if($this->request->params[“prefix”]==”m”){
$this->response->body(mb_convert_encoding($this->response->body(), ‘SJIS-win’, ‘UTF-8’));
$this->response->charset(‘SHIFT-JIS’);
}
}

携帯サイト対応っていろいろ面倒ですね。