F.Ko-Jiの「一秒後は未来」

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

携帯サイトを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にします。

  1. rti より:

    同じように悩んで、結局 UTF-8で作っちゃいました。
    何人かのAUユーザーに試してもらっていますが、文字化けがあったという報告はありませんでした。

    FROM でGETを投げたときに UTF-8ではなくSJISでパラメータが飛んでくるという問題はありましたが、GETではなく、POSTにしたら大丈夫でした。

    もし、よろしければ、文字化けした機種を教えていただけないでしょうか。

  2. F.Ko-Ji より:

    >> rtiさん
    コメントありがとうございます。

    友人の機種は INFOBAR 2 (デバイスID: ST33) のはずです。

    FORMの件もちらっと見かけたのでSJISにしましたが、POSTとGETで違うんですね。。。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など