普段持ち歩いているauの携帯電話なんだが、おいらは移動中こいつを使ってWebを閲覧している。この携帯電話、ブラウザ部分に不満をあげるとすればUTF-8で記述されたページを正しく表示できないことなのだ。
当サイトでHTMLの配信用MIMEタイプに、application/xhtml+xmlを採用したのは2002年の12月。HTML混在型のPHPファイルにメディアタイプを決めうちするためのスクリプトを仕込んだのが始まり。そもそもブラウザ判別とか面倒くさい仕掛けが多くて、(当時、まだ一度も使ったことのなかった)PHPに頼らざるを得なかったわけで、それはもう素人にとっては複雑なコードになりましたですよ( ̄△ ̄;。
んで、少しでも楽をしようと思ってXSLTを導入。こいつが元XMLファイルから変換の際に自動的にPHPコードを埋め込んでくれるんで楽は楽だったけど、実際にPHPを通さないときれいに整形されなかったりして、書いていて気持ち悪い思いをしていたわけだ。URLの末尾が.phpになってるくせに、ファイルに書かれているコードのほとんどがHTMLっていうのも、なんだか格好悪かったし。
ちなみにapacheのmod_rewriteを使うことで、静的なHTMLに対してMIMEタイプの切り替えはできるらしいのだが、まぁ今回は考えないことにしょう。
つーわけで、サイトのシステムを少々いじることにした。元はHTML文書、かつブラウザのHTTP_ACCEPTヘッダの内容を見てMIMEタイプを振り分けてくれる、かつURLのお尻が.phpではなくて、かつincludeなどの動的コンテンツの美味しいところを取り入れつつ、SEOを考えて検索エンジンには静的コンテンツに見えるURLを吐き出す、などと我が儘な要件を書き出し、それに合う方法を考えてみた。
このシステムの勘所はURL。Webサーバにアップロードするファイルは静的なHTMLということは、PHPで読み込んで加工してあげることになるのだが、「?joyu=yataakiko&word=drama」みたいな文字列が含まれるURLを使うと検索エンジンさんに呆れられてしまうという風聞を耳にした故、ここをなんとかしないとならない。
幸いAmazon.co.jpなどのURLが動的コンテンツであるにも関わらず、静的っぽい(?)URLを吐き出しているのを知っていたので、CGI側で「/」で区切られたURLをGETで送られてきた値と見なす方法を探してみたところ、「PATH_INFOを使った掲示板への変更方法」というページが検索に引っかかった。
これを基に、join関数を用いたHTMLファイルの読み込み、ブラウザ判別によるHTMLの書き換えを加えたスクリプトを作成。これで下記に配置したHTMLファイルをPHP経由で読み出した(リンク先がサンプル)ところ、問題なく表示できた。
PHP上で<?〜?>を含む文字列を置換する方法がどうしてもわからなかったり、使えるCSSはPHP上に直接書かないとならなかったりとか、条件にマッチしないキーワードだけを抜き出す方法を思い出せなかったり(おかげで処理速度が遅い。誰か改良してくれ)と、相変わらず素人丸出しなのはご容赦を( ̄△ ̄;。超長いURLをぶち込んだときの脆弱性なんかも全然チェックしていないしね。
結局移動中に使う端末は、小さいのに限る。というわけで半年ほど前から外出中のWeb閲覧にはSony Ericson製のau端末「W21S」を使っている。メモリ容量も大きく、テキスト中心のサイトならわりとわけなく読み込めてしまうのだ。
ただし、普段の利用法では全く気が付いていなかったのだが、この携帯電話はUTF-8で記述されたコンテンツを読み込むと文字化けを起こす。おいらは通常、はてなアンテナ経由でWebを巡回するため、はてなのCGIで一回ShiftJIS形式に変換されたコンテンツを見ていることになる。またBlogなどにアクセスする場合も、CGIがEUC-JPなどの形式で吐き出してくれるため、こうした弱点にお目にかかることはまずない。
唯一、おいらのWeb巡回先でUTF-8にぶつかる可能性があるのは、このサイト。自分のサイトなど外出してまで見たいものではないが、表示できないのは非常に悔しい。しかもFOMAではUTF-8だろうと問題なく表示する。FOMAの誘惑を断ち切ってまでWINを買ったおいらとしては、先日用意したページ表示用のPHPスクリプトを改造して、au対応にすることにした。
改造箇所は、Content-Typeの設定部分と、ページを吐き出すprint命令の直前。どちらもHTTP_USER_AGENTの値として「KDDI」を含むUA名を返してきたUAに対し、ブラウザ振り分けを行う。つまり、auの最近の携帯に対してのみShiftJISでHTMLを送出するのだ。
前者では、ブラウザに送出するエンコードの設定を行う。Content-Typeの値としてheader関数で「SJIS」を指定、MIMEタイプはapplication/xhtml+xmlで問題ない模様。またHTML上でUTF-8を指定している部分はstr_replace関数を使ってutf-8からshift_jisに書き換えていく。
後者では、ブラウザに吐き出す実際の文字コードをmb_convert_encoding関数を使って、UTF-8からShiftJISに変換を行っった。
これでまあWIN端末なら問題なく、見られるようになるかな。まだスカンクワークスなどメインコンテンツがこのCGIに移行できていないので、試しに「CSS 關係者に37+いくつかの質問」を同CGI向けにデータ移行して確認した。何の問題もなし。モバイル用ということでhandheld用CSSも設定しているが、セレクタへの対応具合などの癖がよくわからなくて、妙な雰囲気になっているのはご愛敬。