EthnaでShift_JISなサイトを作る
書いた人:cocoiti
概要
Ethnaは、内部コードがutf-8でできています。(変換かければ、どうにでもなりますが)。
基本的に問題はないのですが、携帯サイトなどを作る時に、やむえず、出力をShift_JISにしたくなるときがあります。
その方法について記述していきます。
なお、以下のポリシーで記述しています。
- 内部コードはutf-8
- 入力コードはShift_JIS(自動判別のフィルタを書く方法は別途記述)
- 出力コードはShift_JIS(sjis-win)
内部コードはutf-8で書く
各種テンプレート(HTML、メール)も含め通常通り、utf-8で記述します。
入力のShift_JISを内部コードに変換
まずは、Ethnaのフィルタで入力コードを変換してしまいます。
function preFilter() { $_POST = InputEncoding($_POST); $_GET = InputEncoding($_GET); } (省略) function InputEncoding($data) { static $encoding = null; static $internal_encoding = null; if (is_null($encoding)) { $encoding = 'sjis-win'; } if (is_null($internal_encoding)) { $internal_encoding = 'eucjp-win'; } if (is_array($data)) { return array_map('InputEncoding', $data); }else{ return mb_convert_encoding($data, $internal_encoding, $encoding); } }
こんな感じで、sjis-win => euc-winに変換します。
出力コードを変換する
Smartyフィルタで、出力コードをShift_JISにしてしまいます。
function smarty_outputfilter_encode($output, &$smarty){ return mb_convert_encoding($output, "SJIS-win", "eucJP-win"); }
これでWeb上の文字コードはShift_JISになります。
- これの代わりにprefilter()でmb_http_output("SJIS");mb_internal_encoding("utf-8");をするのはありでしょうか? (n071316)
コントローラに追加する
変換コードを書いたら、それをappやlibに保存して、プロジェクトのコントローラの先頭部分でrequireしましょう。
MailSenderのSmartyでフィルタが有効になっている問題
通常なら、上記までで十分なのですが、Ethna 0.2.0までの全てのバージョンは、Ethna_MailSenderにおいて、Smartyを使用しています。
これはこれでかまわないのですが、先ほどのSmartyフィルタが有効になっているため、utf-8 => sjis-winと変換されメール送信アルゴリズムが動作します。*1
さらにここまでもまぁ問題ないのですが、運がわるいことに、Ethna_MailSernder::_parse()がShift_JISだとうまくパースできない場合があるので*2、これをutf-8に戻してやります。
幸いにもEthna_MailSenderは継承して使用するのが基本なので、継承したついでに継承後のクラスに以下を追記します。
function _parse($mail) { $mail = mb_convert_encoding($mail, "eucjp-win", "sjis-win"); return parent::_parse($mail); }