Symfony1.4系でモバイルページをSJIS変換
2011年5月13日そろそろモバイルページもutf8などへ対応完了しているんですが、やはりモバイルページとなるとSJISでの作成になる(もうこんなことしなくていいのかもしれないけれど)。
Smartyの場合であれば、output_filterで簡単。
Symfonyにもあるんじゃ?と調べたら、やはりありました。
拾い物をやや加工してますが、メモとして残しておきます。
フィルタを作成。
$ vim lib/filter/MobileFilter.php
<?php /** * モバイル用文字コード変換フィルタ * * 文字コード変換(mb_convert_encoding)と合わせて、 * 半角化(mb_convert_kana)も実行 * * @package: MobileFilter * @author: $Aurh$ * @version: 1.0 * @revision: $Rev$ * **/ // require require_once ('Net/UserAgent/Mobile.php'); class MobileFilter extends sfFilter{ /** * フィルタ * * @param filterChan * **/ public function execute($filterChain = null) { if ($this->isFirstCall()){ // error出力設定 $er=error_reporting(); if ($er > E_STRICT){ error_reporting($er - E_STRICT ); } // Net::UserAgent::Mobile のインスタンスをセッションへ保存 //$userAgent = &Net_UserAgent_Mobile::factory(); //$this->getContext()->getRequest()->setAttribute('userAgent', $userAgent); // パラメータのエンコーディング変換 // sfConfig::set('sf_charset',"shift_jis"); sfConfig::set('sf_charset',"UTF-8"); $this->encodingParams('SJIS-win','UTF-8'); mb_internal_encoding('UTF-8'); // バッファ ob_start(array($this,'m_output_handler')); } if ($filterChain) $filterChain->execute(); } /** * バッファのmb_convert_encoding() * * @param string $buffer **/ function m_output_handler($buffer) { sfConfig::set('sf_charset',"shift_jis"); ~~~~~~~~ // エラーログ出力 //error_log($buffer,3,"/var/www/morenavi/log/mobile.log"); $buffer = mb_convert_kana($buffer, 'ansk'); return mb_convert_encoding($buffer,'SJIS-win','UTF-8'); } /** * パラメータのエンコーディング * * @param $from sjis * @param $to utf8 **/ protected function encodingParams($from,$to) { if ($to !='' && $from !='' && $from != $to ){ // パラメータフォルダ $keys=sfContext::getInstance()->getRequest()->getParameterHolder()->getNames(); foreach ($keys as $key){ // パラメータフォルダの$keyに対応したvalue取得 $val=sfContext::getInstance()->getRequest()->getParameter($key); //配列対応(2次元まで) if (is_array($val)) { foreach ($val as $key1 => $val1) { if (is_array($val1)) { foreach ($val1 as $key2 => $val2) { $val[$key1][$key2] = mb_convert_encoding($val2,$to,$from); } } else { $val[$key1] = mb_convert_encoding($val1,$to,$from); } } } else { $val = mb_convert_encoding($val,$to,$from); } // パラメータセット sfContext::getInstance()->getRequest()->setParameter($key,$val); } } } }
フィルタを登録。
$ vim app/<>/config/filters.yml ... MobileFilter: class: MobileFilter
最後に、出力文字コードをview.ymlへ記載
$ vim app/<>/config/view.yml ... default: http_metas: content-type: text/html charset=Shift_JIS