3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(PHP)Smartyを使っているがShift-JISで出力したい

Shift-JISで作られているCGIのサイトをPHP(テンプレートエンジンとしてSmarty使用)に移行してるんですが、やはり移行後もわけあってShift-JISでないとダメなようです。

で、SmartyのテンプレートファイルをShift-JISで作るとエラーが。。。

どうやら「必須」という文字がSmartyのメタ文字「{」となっちゃってるようです。

やはり、Shift-JISのファイルは作っちゃダメだなということで、テンプレートファイル、PHPファイル共にUTF-8で書き、Smartyのアウトプットフィルタを使って出力時にShift-JISに変換することとしました。

以下のような感じです。

//Smarty読み込み(ドキュメントルート外のSmartyクラスにアクセス)

require_once('Smarty.class.php');

//Smartyオブジェクト作成

$smarty = new Smarty();

$smarty->template_dir = "/smarty/templates";

$smarty->compile_dir = "/smarty/templates_c";

$smarty->cache_dir ="/smarty/cache";

 

//アウトプットフィルタを使用し文字コード変換

$smarty->registerFilter("output","filterSjis");

ini_set("default_charset", "Shift_JIS");

 

//テンプレート表示

$smarty->display("hoge.tpl");

 

//smartyアウトプットフィルタ

function filterSjis($buff, &$smarty){

return mb_convert_encoding($buff,"SJIS","UTF-8");

}

参考サイトでは $smarty->register_outputfilter を使っているですが、Smarty3でこのメソッド使うと、"Notice: function call 'register_outputfilter' is unknown or deprecated." みたいなエラーになります。

Smarty3系からは $smarty->registerFilter(タイプ,コールバック関数); としないといけないようです。

参考:

Smartyのアウトプットフィルタを使ってみる kawama.jp

エピゴーネンで | register_prefilterの挙動を変えるとかなしにしようぜSmartyさん

SJISページでのSmartyの使い方 | ガイドミー管理者日記