CodeIgniter

Tips モバイル(ガラパゴス携帯電話 対応サイト)

文字コード変換

  • CodeIgniter内は、UTF-8で処理する。
  • HTMLページでは、Shift_JISで表示する。

リンク

> CIのファイルinput→CIのファイルoutputだとPOSTの値が化けるが、CIのファイルinput→素のPHPファイルoutputだと化けないというところがなかなかに理解し難いところです。

これは CI が入力値をサニタイズしていることが原因です。
$config['charset'] = 'UTF-8';
の場合、core クラスの Utf8 クラスが追加の処理をします。
clean_string() メソッドで以下の処理が走ります。

  1
  2
  3
  4
  5
  6
  7
  8
<?php     function clean_string($str)
    {
        if ($this->_is_ascii($str) === FALSE)
        {
            $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str);
        }
 
        return $str;
    } ?>

ベストプラクティスとしては、
$config['charset'] = 'UTF-8';
で、ソースコードは UTF-8。HTML 出力時に Shift_JIS に変換。
そして、入力時に Shift_JIS のデータを UTF-8 に変換する必要があります。
注意が必要なのは、CI がサニタイズする前に入力データの文字コード変換をする必要があるということでしょうか。

SJISで結果が出力されれば良いと言うことであれば、
controllerはUTF-8で書いて、最後にmb_convert_encodingでSJISに変換して出力してみてはいかがでしょうか?

  1
  2
  3
  4
  5
  6
<?php function _output_sjis ($html = "") {
    $output = mb_convert_encoding($output, 'SJIS', 'UTF-8');
    // header('Content-Type: text/html; charset=shift-jis;');
    header('Content-Type: text/html; charset=Shift_JIS');
    // ですね(大文字小文字は区別なしですが、ハイフンとアンダースコアは違います)。
    echo $output;
} ?>

携帯電話対応のため、出力文字コードを ShiftJIS にしたかった。
結論としては、$this->load->view() は、Controller のメソッドの最後に呼ばれるビューを設定するだけなので、出力直前に文字コードを変更してやれば良いことになります。
なので、view() メソッド呼び出しのあと、出力クラス( output )を利用しました。

<?php $this->output->set_output(mb_convert_encoding($this->output->get_output(), 'SJIS', 'UTF-8')); ?>

で動作を確認。
もちろん動くのですが、View クラスと UserAgent クラスを組み合わせるなどしないと、ださいですね。Hook で作る方が正しいかもしれません。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-05-22 (日) 17:38:24 (3121d)