[BACK]


>Oct 18,2006 (Wed) 01:22 - [php mobile symfony] 携帯向けコンテンツで大はまり この記事をクリップ!

携帯向けコンテンツの作成を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。

strncmp(SG(sapi_headers).mimetype, "text/", 5) == 0)

どうみても、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]