Smartyでデリミタ変更 & 文字化け解決方法
smartyっていうテンプレートエンジンがあるのですが、最近ちょっと触る機会があっていろいろと触ってみました。
ええまあデフォルトのままですと色々と問題がありまして・・
smartyだとsjisでデリミタに { } が使えない
どうやら必須の「須」の2バイト目に「}」が入っていた模様・・・
これはデリミタを{{ }} に変更することで対応。
$smarty->left_delimiter = '{{'; $smarty->right_delimiter = '}}';
次は出力時に日本語が文字化けする件について・・・
-
-
- ujis ---
-
出力文字エンコーディング
-
-
- sjis ---
-
「テンプレートの文字コードをEUC-JPにする必要があるのではないか!?」と思い変換して試したが関係なかったみたい。
結局どうしたかというと、
■phpソースの文字コードはEUCで記述。
■テンプレートファイルの文字コード適当でww
■preフィルターを使い、内部の処理の文字コードは全てEUCで統一
// プレフィルタ登録 $smarty->register_prefilter(array($this,'convert_encoding_to_eucjp')); function convert_encoding_to_eucjp($template_source, &$smart) { if (function_exists("mb_convert_encoding")){ // mbstringモジュールが利用可能でテンプレートがEUC-JPでない場合は // 文字コードを変換する $enc = mb_detect_encoding($template_source, 'sjis-win,eucjp-win,SJIS,EUC-JP,JIS,UTF-8,ASCII'); if($enc != "EUC-JP"){ return mb_convert_encoding($template_source, "EUC-JP", $enc); } } return $template_source; }
■フォームから取得する値に関しては全て一枚ラッピングして mb_convert_encoding にてujisに変換する。
//データのサニタイズ & エンコーディング
function sanitize($s,$src_char){
if($s == ""){
return "";
}
$enc = mb_detect_encoding($s,'sjis-win,eucjp-win,SJIS,EUC-JP,JIS,UTF-8,ASCII');
//var_dump($enc);
if($enc != $src_char){
$s = mb_convert_encoding($s,$src_char,$enc);
}
$wk = htmlspecialchars($s,ENT_QUOTES,$src_char);
return $wk;
}
■テンプレート出力する display メソッドをオーバーライドして出力文字エンコーディングに統一した後に出力処理を行う。
function display($template, $cache_id = null, $compile_id = null)
{
//結果をいったん変数に格納
$output = parent::fetch($template);
//表示用エンコードに変換
$output = mb_convert_encoding($output,$this->get_display_encode(),"EUC-JP");
echo $output;
}
こんな感じでガチガチに固めてやったら上手く動くようになりました。