| [BACK] |

携帯向けコンテンツの作成をPHPでやっててちょっとはまったのでメモ。
最近の携帯はスタイルシートが使えるらしいです。
全然使えないと思っていたDoCoMoの移動機でも、901系からは使えるみたい。
ただし条件があって、XHTMLで書かれていてcontent-typeで「application/xhtml+xml」を送らないとだめらしい。
で、まあここまではよかったんだけどその後で問題が。
あうーauの移動機でもXHTMLでコンテンツ作ってれば問題はないんだけど、UTF-8で出力するとなぜか化ける。
PHPは内部をSJISで動かすと具合が悪いことも多く、こういうときは通常mb_output_handlerを使って
「内部UTF-8 or EUC-JPで動かして出力をSJISで」
ってするんだけど、header関数で「application/xhtml+xml」を送信すると、
mb_output_handlerを無視してしまうらしい。
試しにPHPのソースコードの該当部分を見たらこんな感じになっていた。
該当コードはsrc/ext/mbstring/mbstring.c。
どうみても、text/???の時しか通ってない!
仕方ないのでcontent-typeを適当にtext/xmlとかにしてみたら、
auではSJISで正常に表示できたけど今度はdocomoでスタイルシートが効かなくなるorz
これ、皆さんどうしてるんでしょう。
弊社CTOとかとも相談したんだけど、もうどうしようもないねってことでmbstring.cにパッチあてて回避してしまった(ぶ
しかもor条件で
strncmp(SG(sapi_headers).mimetype, "application/xhtml+xml", 21) == 0)
を追加するだけという・・・。
とりあえずこれで問題解決にはなったんだけど、
「以前はtext/???だけ変換していればよかったけど時代は移り変わっていて
PHP側がそれに追従できていない」
という例なのかもー。
・・・本当にみんなどうしてるんだろ(苦笑
ます - Oct 18,2006 (Wed) 12:20あいたたた。。。早速、取り込ませて頂きます。(^^;
ヘッダー周りで他にもあったら教えて下さいませ。
maru - Oct 18,2006 (Wed) 18:52初めまして。
うちはmb_output_handlerを切って
ob_startで自前の文字コード変換を通してます。
Content-Lengthも一応必須となってるので変換後に出してます。
他にも絵文字や画像なんかもキャリアや端末に合わせて
よしなに変換してくれるフィルタとか。
[BACK]