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になるっすね。
これでよし。
