携帯サイトでSmartyを使う場合の注意点
Tweet
「ケータイサイトにSmartyを使おうとしたがうまくいかない」という質問をよく受けることがあるので、注意点をまとめてみます。
問題となるのは、文字コードに「Shift_JIS」を使った場合です。
最近は対応端末が増えたため、UTF-8でページを作る場合も多いですが、過去の資産やら、互換性の問題やらでShift_JISを使うこともあります。
ところがSmartyではSJISは使えません。
なぜなら、Smartyの標準のデリミタである
「 { 」 (0x007b)、 「 } 」 (0x007d)
を、SJIS文字列が含んでしまっていることがあるからです。
(つまり必ずしもエラーにはならないことに注意が必要です)
エラーが起こった場合には次のようなメッセージが表示されます。
Fatal error: Smarty error: [in path/to/tpl.html line 10]: syntax error: unrecognized tag: ‹ (Smarty_Compiler.class.php, line 446) in /path/to/Smarty/Smarty.class.php on line 1095
これを回避するには、主に次の2つの方法があります。
1. デリミタを変更する
波カッコが悪さをしているので、それを変更してしまえば大丈夫です。
次のようにしてデリミタを変更することができます。
$smarty->left_delimiter = '{{';
$smarty->right_delimiter = '}}';
デリミタを変更した場合は、テンプレート内の他のSmartyタグも忘れずに変更しましょう。
修正前 : {$hoge} 修正後 : {{$hoge}}
他にも「<{$hoge}>」なんかを使う人もいます。この辺りは好みの問題です。
2.プリフィルタとポストフィルタを設定する
プリフィルタとポストフィルタを設定することで、Smartyでテンプレートが処理される際に、テンプレートがEUC-JPとして処理され、その後再びSJISとなって出力されます。
※この方法を使った場合には、ドコモのSJIS形式の絵文字が文字化けしてしまうので注意が必要です。
絵文字を使いたい場合はSJIS方式ではなく、&xxxxx;方式で書きましょう。
$smarty->register_prefilter("convert_encoding_to_eucjp");
$smarty->register_postfilter("convert_encoding_to_sjis");
//--------------------------------
// Smarty SJIS対応用関数1
//--------------------------------
function convert_encoding_to_eucjp($template_source) {
if (function_exists("mb_convert_encoding")) {
//文字コードを変換する
return mb_convert_encoding($template_source, "EUC-JP", "SJIS");
}
return $template_source;
}
//--------------------------------
// Smarty SJIS対応用関数2
//--------------------------------
function convert_encoding_to_sjis($template_source) {
if (function_exists("mb_convert_encoding")) {
//文字コードを変換する
return mb_convert_encoding($template_source, "SJIS", "EUC-JP");
}
return $template_source;
}
3. 検証
検証は文字コードの中に「{」や「}」を含んでいる文字を書いてやればOKです。
(例:「閲」「厭」「宮」「急」「鶏」「迎」など)
例えば「鶏を迎え討つ」などとSJISテンプレートに記載し、表示されれば大丈夫ということになります。
4. まとめ
- Smartyは、そのままではShift_JISは使えない
(ただし半端に動作することに注意) - SJISを使いたい場合は、デリミタを変えるか、プリフィルタ・ポストフィルタを使う
- 検証は「閲」「厭」「宮」「急」「鶏」「迎」などで
関連:
- PHPで絵文字を壊さずに文字コードや全角半角変換を行う方法
- iモード絵文字をUnicode形式からSJIS形式に逆変換するPHPサンプル
- iモード絵文字をSJIS形式からUnicode形式に変換するPHPサンプル
12月 2nd, 2008 at 12:08:33
[…] ke-tai.org > Blog Archive > 携帯サイトでSmartyを使う場合の注意点 […]