文字化け対策(1) 携帯

ひとまず、携帯(偽装)側が一番正しく動いているようなので、こちらから問題解決することに。

http://d.hatena.ne.jp/cake67/20091014/1255505385?title=昨日の記事に書いたコードにちょっとミスあったので修正(mb_convert_encode周り)

出力側のUTF-8SJISは、ほぼ問題なし。
ただ、サーバでUTF-8出力が強制化されていたのでコメントアウトして解除。

# vi /etc/httpd/conf/httpd.conf
#AddDefaultCharset UTF-8

に変更して、
# /init.d/httpd restart

入力側のSJISUTF-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');
}