FuelPHPで内部文字コードと出力文字コードが違うケースを割とちゃんと対応する

FuelPHPネタが増えてきた。
今日はFuelPHPで内部文字コードと出力文字コードが違う場合の対応。

簡単に対応するのであれば、Controllerのafterメソッドでmb_convert_encodingしてあげればよい。

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

ただ、文字コード周りをちゃんと設定するのであれば以下のようにした方がいいと思う。

1. fuel/app/config/config.phpで文字コード周りの設定を行う

<?php
return array(
       /**
        * アプリケーションの文字コード
        */
        'encoding' => 'UTF-8' ,
        /**
        * アプリケーションのデフォルト言語
        */
        'language' => 'ja' ,
       /**
        * charset header設定
        */
        'default_charset' => 'Shift-jis' ,
        /**
        * mimetype header設定
        */
        'default_mimetype' => 'text/html' ,
        /**
        * 文字コード関連設定
        */
        'mbstring' => array (
               'language'             => 'Japanese' ,
               'internal_encoding'    => 'UTF-8' ,
               'script_encoding'      => 'UTF-8' ,
               'http_input'           => 'pass' ,
               'http_output'          => 'sjis' ,
               'substitute_character' => 'none' ,
       ),
);

2. configの設定をbootstrap.phpあたりで反映する
Fuel::init(‘config.php’);の下あたりに

ini_set('default_charset',            Config::get('default_charset'));
ini_set('default_mimetype',           Config::get('default_mimetype'));
ini_set('mbstring.language',          Config::get('mbstring.language'));
ini_set('mbstring.internal_encoding', Config::get('mbstring.internal_encoding'));
ini_set('mbstring.http_input',        Config::get('mbstring.http_input'));
ini_set('mbstring.http_output',       Config::get('mbstring.http_output'));

3. Configの設定を文字コード変換に反映する

public function after($response)
{
    $this->template = mb_convert_encoding($this->template, Config::get('mbstring.http_output'), Config::get('mbstring.internal_encoding'));
    return parent::after($response);
}

てな感じで。