ネットサービスとかGoogleとか豆知識とか。

Index > モバイル > 携帯サイトをUTF-8で出力するかShift_JISで出力するか
モバイル
2008年09月21日 15:52

携帯サイトをUTF-8で出力するかShift_JISで出力するか

  • このエントリーをはてなブックマークに追加
  • ... PV
スポンサード リンク

携帯サイトをUTF-8で出力しようかShift_JISで出力しようか悩んでいました。

超手抜きでウェブサイトをモバイル対応 2008 - 15Pubを読むと「UTF-8でも大丈夫」とあるのですが、ウノウラボ Unoh Labs: 携帯サイト作成時のXHTMLでの相違点では「文字コードはShift_JIS」と書いてあります。

ネットで調べてみるとポイントになっているのは au の仕様で、公式ページには「EZwebでサポートする文字コードはShift-JISです」とあるにも関わらず、UTF-8でも文字化けすることなく表示できてしまうとのこと。

色々迷った挙げ句、「楽だから」という理由でまずはUTF-8で出力することにしました。

HTMLのContent-Typeは以下のように記述。

<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

さらにHTTPヘッダでも以下のヘッダを返すように設定。

Content-Type: application/xhtml+xml; charset=UTF-8

これで大丈夫かなと思ったら、auを使っている友人から「文字化けしとるぞ」と言われてしまいました。(自分はauの実機を持っていない)

そこで、やはり無難にShift_JISにしたほうがいいのかな、と思ってやり直し。

Shift_JISに方針転換

プログラムやテンプレートファイルなどすべてUTF-8で書いているので、出力だけShift_JISにします。Smartyを使っているので、文字コードを変換するアウトプットフィルタを設定すれば済みます。

$smarty = new Smarty();
$smarty->load_filter('output', 'convert_encoding');

作成するプラグインは次のようなもの。

function smarty_outputfilter_convert_encoding ($output, &$smarty) {
    return mb_convert_encoding($output, 'SJIS-WIN', 'UTF-8');
}

わかりやすくするために、文字コードのところは定数にしていません。SJIS-WINを使っているのはこちらを参照。(ke-tai.org > Blog Archive > PHPで絵文字を壊さずに文字コードや全角半角変換を行う方法)

さらに、Shift_JISのページではフォームから送信されるデータの文字コードもShift_JISになるため、アプリケーションのフロントエンドで GET と POST の値をすべて UTF-8 に変換します。ここでもSJIS-WINから変換するようにすれば絵文字が崩れません。フロントエンドで変換したうえでアプリケーションにフォーム変数を渡します。

こうすることでプログラム内部ではUTF-8のデータが流れるので、データベースに保存される文字コードなどを気にする必要もありませんし、パソコン向けページはそのままUTF-8で出力ができます。

あとはHTTPヘッダとmetaタグのcharsetをShift_JISにします。