携帯ShiftJIS

|

「ケータイサイトにSmartyを使おうとしたがうまくいかない」という質問をよく受けることがあるので、注意点をまとめてみます。

問題となるのは、文字コードに「Shift_JIS」を使った場合です。
最近は対応端末が増えたため、UTF-8でページを作る場合も多いですが、過去の資産やら、互換性の問題やらでShift_JISを使うこともあります。

ところがSmartyではSJISは使えません。
なぜなら、Smartyの標準のデリミタである

{ 」 (0×007b)、  「 } 」 (0×007d)

を、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を使いたい場合は、デリミタを変えるか、プリフィルタ・ポストフィルタを使う
  • 検証は「閲」「厭」「宮」「急」「鶏」「迎」などで

'TIP' 카테고리의 다른 글

戻るボタン禁止  (0) 2010.09.14
우클릭 잠금/해제  (0) 2010.07.01
asp2php, php2asp  (0) 2010.06.14
Smarty설치시 문자깨짐을 막아 주는 법  (0) 2010.06.10
日本P2P  (0) 2010.06.09
And