シフトJISで記述されたテンプレートファイルを使うために
Smartyではテンプレートファイルとして、EUC-JPまたはUTF-8で記述されたテンプレートを使用することになっている。Shift_JISで記述されたテンプレートファイルは文字化けする。これはおそらく、元来PHPがShift_JISをサポートしていないためだろう。もちろんPHPでも変数内にShift_JISの文字列を格納することはできる。Smartyの場合はテンプレートファイルからPHPの実行形式のファイルを生成する(テンプレートファイルをコンパイルして使うので)。これはつまり、テンプレートファイルに書かれたことがそのままPHPで実行して表示される、と考えるべきだろう。つまりテンプレートファイルをShift_JISで記述するということは、PHPプログラムをShift_JISで記述することと同義なのだ。これでは文字化けして当然だ。
で、どうするか。
Smartyのプレフィルタという機能を使う。これによりテンプレートファイル読み込み時にいったんファイルを内部文字エンコードに変換してしまうのだ。では、どうするか。
まずSmartyのプラグインディレクトリに、以下のような関数ファイルを設置しておく(ファイル名prefilter.sjis2euc.php)。
<?php
function smarty_prefilter_sjis2euc($buff,&$smarty)
{
return mb_convert_encoding($buff,’EUC-JP’,’SJIS’);
}
?>
これを以下のように呼び出す。
$smarty->load_filter(‘pre’,’sjis2euc’);
これでShift_JISで書かれたテンプレートを使うことができるようになる。ちなみにテストをするときは、その都度Smartyが生成したキャッシュファイルを削除しておくことを忘れてはいけない。キャッシュが生成された状態では、いくらフィルタを設定しても、新しくコンパイルしなおしてくれないからだ。
これでデザイナにも簡単に作業してもらえる。