文字化け対策(1) 携帯
ひとまず、携帯(偽装)側が一番正しく動いているようなので、こちらから問題解決することに。
http://d.hatena.ne.jp/cake67/20091014/1255505385?title=昨日の記事に書いたコードにちょっとミスあったので修正(mb_convert_encode周り)
出力側のUTF-8→SJISは、ほぼ問題なし。
ただ、サーバでUTF-8出力が強制化されていたのでコメントアウトして解除。
# vi /etc/httpd/conf/httpd.conf
#AddDefaultCharset UTF-8に変更して、
# /init.d/httpd restart
入力側のSJIS→UTF-8は、$this->dataが配列で、mb_convert_encodeは文字列のみだったので、配列全体の変換用関数を追加して、array_walkで対応。
上手く動いたソースは以下の通り
app/controller/app_controller.php
/**
* 携帯用AppController
*/
class MobileAppController extends AppController
{
function __construct ()
{
parent::__construct();}
function beforeFilter()
{
parent::beforeFilter();// 入力データの文字コード変換
@array_walk_recursive($this->data, "convertEncodeSjis2Utf8");
}function beforeRender()
{
parent::beforeRender();$this->layout = 'mobile_'.$this->layout;
}function afterFilter()
{
parent::afterFilter();// 全角文字の変換
$this->output = mb_convert_kana($this->output, "rak", Configure::read('App.encoding'));
// 出力文字コードの変換
$this->output = mb_convert_encoding($this->output, "SJIS", Configure::read('App.encoding'));}
(中略)
/*
* 文字コード変換 SJISWin->UTF-8
*/
function convertEncodeSjis2Utf8(&$str, n$key)
{
$str = mb_convert_encoding($str, 'UTF-8', 'SJIS-Win');
}