ZendのSmartyで文字コード変換
( diary )分け合ってUTF-8のデータをンプレート出力時にはデータをSJISに設定する必要がでたのでそのメモ。
■動作 HTTP(INPUT):SJIS 内部(データ、ファイルもろもろ):UTF-8 HTTP(OUTPUT):SJIS
// My_View_Smarty 内の関数 public function __construct($tmplPath = null, $extraParams = array()) { // オブジェクト生成 $this->_smarty = new Smarty(); // テンプレートパス設定 if (null !== $tmplPath) { $this->setScriptPath($tmplPath); } // 設定情報をメンバ変数へ foreach ($extraParams as $key => $value) { // define function if (is_array($value)) { foreach ($value as $key2 => $value2) { // 出力時の関数指定 if ($key === "outputfilter") { $this->_smarty->autoload_filters['output'][] = $value2; } else { $this->_smarty->{$key}[] = $value2; } } } else { $this->_smarty->$key = $value; } }
その次は関数の設定
function smarty_outputfilter_convertSjis($output, &$smarty) { return mb_convert_encoding($output, 'SJIS-win', 'UTF-8'); }
あとはブートストラップ使ってPHPの設定情報を変更する。
phpSettings.mbstring.internal_encoding = "UTF-8" phpSettings.http_input = "UTF-8" phpSettings.http_output = "pass" ; smarty のアウトプットフィルターに関数を登録する ; 番号指定で複数可能 resources.viewsmarty.outputfilter.0 = "convertSjis"
こんな感じで変換してみた。
もとにもどすときはapp.iniの設定抜くだけで全部UTF-8になるっすね。
これでよし。