プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.7、HTMLをShift_JISで出力する(1)
結論から言えば

1.内部処理はすべてUTF-8で行う
2.変数等も設定して出力するだけの状態にしてから、丸ごとShift_JISに変換する

が無難っぽいです。

そもそものきっかけはガラケー対応でした。
Controller_Templateを使ってHTML出力していたのですが、
古いガラケーにはUTF-8だと文字化けっちゃうのもあるので、
結果のHTMLはShift_JISで出力しておくのが無難かなーと思いましてね。

ところがどっこい、出力HTMLの文字エンコードを指定する場所が無い。

ん(--?
てっきり設定ファイルのどこかに「出力HTMLの文字エンコード」を
指定する場所があると思ったんだけど、ないの(--?
というのが今回調べたきっかけです。

ほんであれこれ調べたのですが、結局ありませんでした。
※もしかしたらどこかにあるのかもしれませんが、
 私は見つけられませんでした。

自前で変換するしかないようです。

いや、まぁ、変換すれば良いだけなんですけどさ。
どこで変換すれば良いのよ?

パッと思いつくのは

■パターン1
・コントローラはUTF-8
・コントローラでテンプレートに設定する変数はUTF-8→Shift_JIS変換
・テンプレートはShift_JIS

■パターン2
・コントローラはUTF-8
・コントローラでテンプレートに設定する変数はUTF-8
・テンプレートはUTF-8
・出力直前にテンプレート(値設定後)をUTF-8→Shift_JIS変換

の2パターンでしょうか。
コントローラ含め、すべてをShift_JISにするのは直感的に却下しました。
多分、core部分も含めて全部Shift_JISにしないと意味無いでしょ。めんどっちー。

それでは実験です。

まずは

■パターン1
・コントローラはUTF-8
・コントローラでテンプレートに設定する変数はUTF-8→Shift_JIS変換
・テンプレートはShift_JIS

をやってみます。
テストコードがこちらφ(--)

■コントローラ(UTF-8)app\classes\controller\test01.php
<?php
class Controller_Test01 extends Controller_Template
{
    public $template = 'template_hoge';

    public function action_index()
    {
        $this->template->msg = mb_convert_encoding('ほげほげ', "SJIS-win", "UTF-8");
    }
}

■テンプレート(Shift_JIS)app\views\template_hoge.php
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
    <title></title>
</head>
<body>
メッセージ:<?php echo $msg ?>
</body>
</html>

結果がこちらφ(--)

メッセージ:

うん、理由は分かりませんが、値が設定されませんでした。
試しにコントローラを

■コントローラ(UTF-8)
<?php
class Controller_Test01 extends Controller_Template
{
    public $template = 'template_hoge';

    public function action_index()
    {
//        $this->template->msg = mb_convert_encoding('ほげほげ', "SJIS-win", "UTF-8");
        $this->template->msg = 'ほげほげ';

    }
}

に変えたら文字化けはしますが値が設定されたので、
テンプレートの変数にShift_JISの値を渡すのが駄目みたいですね。

と言う訳で、パターン1は失敗\(--)/

次に

■パターン2
・コントローラはUTF-8
・コントローラでテンプレートに設定する変数はUTF-8
・テンプレートはUTF-8
・出力直前にテンプレート(値設定後)をUTF-8→Shift_JIS変換

をやってみます。
テストコードはこちらφ(--)

■コントローラ(UTF-8)app\classes\controller\test02.php
<?php
class Controller_Test02 extends Controller_Template
{

    public $template = 'template_hoge2';

    public function action_index()
    {
        $this->template->msg = 'ほげほげ';
    }

    public function after($response)
    {
        $this-> template = mb_convert_encoding($this-> template, "SJIS-win", "UTF-8");
        return parent::after($response);
    }

}

■テンプレート(UTF-8)app\views\template_hoge2.php
<html lang="ja">
<head>
    <meta http-equiv="content-type" content="text/html; charset=Shift_JIS" />
    <title></title>
</head>
<body>
メッセージ:<?php echo $msg ?>
</body>
</html>

結果がこちらφ(--)

メッセージ:ほげほげ

おぉ、今度はちゃんと値が設定されて表示されました。

テンプレートがちょっと気持ち悪いですかね。
ファイルのエンコードがUTF-8のくせにcharsetがShift_JISってのはどーもなぁ。。
とは言え他に良い方法が思い浮かばないので取りあえずはこれでいきます。
※他にもっと適切な方法が分かったら追記します。

まとめると、処理結果のHTMLをShift_JISで出力したい場合は

1.内部処理はすべてUTF-8で行う
2.変数等も設定して出力するだけの状態にしてから、丸ごとShift_JISに変換する

とするのが、無難なようですね。完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:FuelPHP  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事