SmartyのUTF-8対応

Smartyは、PHPデファクトのテンプレートエンジン。
MVCでプログラムを書こうと思ったら利用しない手はない。
最新版を本家サイトからダウンロードしてみると、2.6.20が最新版。

SmartyUTF-8対応でちょっとてこずったので、覚書に書いておく。

Smarty(2.6.20)を使う上での原則は、

  • Smartyクラスに文字列を渡すときには、UTF-8からeuc-jpに変換する。
  • Smartyクラスからの文字列を、euc-jpからUTF-8に変換する。

ということらしい。つまり、Smartyクラスを、euc-jpで使っているよ、とだますということ。
そうしないと、テンプレートに渡した文字列が化けてしまう

渡した文字列の文字化けを解消するには、前者にはSmartyのprefilter機能、後者にはpost機能を使えばよい。

    $sObj = new Smarty();
    $sObj->autoload_filters = array('pre' => array('pre'),'post' => array('post'));

Smartyオブジェクトに対して設定するのだが、これと同時に、Smarty/pluginsにprefilter.pre.php、postfilter.post.phpを作成して、それぞれ以下のようにする。

・prefilter.pre.php

<?php
function smarty_prefilter_pre($buff, &$mizunara)
{
return mb_convert_encoding($buff,"EUC-JP","UTF-8");
}
?>

・postfilter.post.php

<?php
function smarty_postfilter_post($buff, &$mizunara)
{
return mb_convert_encoding($buff,"UTF-8","EUC-JP");
}
?>