Symfony1.4系でモバイルページをSJIS変換
2011年5月13日そろそろモバイルページもutf8などへ対応完了しているんですが、やはりモバイルページとなるとSJISでの作成になる(もうこんなことしなくていいのかもしれないけれど)。
Smartyの場合であれば、output_filterで簡単。
Symfonyにもあるんじゃ?と調べたら、やはりありました。
拾い物をやや加工してますが、メモとして残しておきます。
フィルタを作成。
[shell]
$ vim lib/filter/MobileFilter.php
[/shell]
[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);
}
}
}
}
[/php]
フィルタを登録。
[shell]
$ vim app/<>/config/filters.yml
…
MobileFilter:
class: MobileFilter
[/shell]
最後に、出力文字コードをview.ymlへ記載
[shell]
$ vim app/<>/config/view.yml
…
default:
http_metas:
content-type: text/html charset=Shift_JIS
[/shell]