携帯サイトを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にします。
同じように悩んで、結局 UTF-8で作っちゃいました。
何人かのAUユーザーに試してもらっていますが、文字化けがあったという報告はありませんでした。
FROM でGETを投げたときに UTF-8ではなくSJISでパラメータが飛んでくるという問題はありましたが、GETではなく、POSTにしたら大丈夫でした。
もし、よろしければ、文字化けした機種を教えていただけないでしょうか。
>> rtiさん
コメントありがとうございます。
友人の機種は INFOBAR 2 (デバイスID: ST33) のはずです。
FORMの件もちらっと見かけたのでSJISにしましたが、POSTとGETで違うんですね。。。