携帯対応中に文字化けに悩まされる修行

PC サイトを携帯対応させる作業をしている。携帯自体あまり使わないし、携帯版の WEB アプリを作るのも初めてで、いろいろ調べながらやっている。
いろいろやっているうちにブラウザで XML パースエラーが発生するようになった。
いろいろ調べてみると、Content-Type の charset を Shift-JIS にして、Shift-JIS で送っているつもりなのだが、どうやら UTF-8 で送られている様子。
Shift-JIS への変換は、output buffering のコールバック関数 mb_output_handler でやっているつもり。

mb_http_output('SJIS-WIN');
ob_start('mb_output_handler');

こんなコードがコメントアウトしてあったので、使えるかな、とそのまま使ってみた。

変換されない原因は mb_output_handler が Content-Type が text のものしか自動変換してくれないところにあった。
Content-Type を application/xhtml+xml にしていたので、変換されなかったのである。

解決策としては、mb_convert_encoding で明示的に変換するコールバック関数を定義することにした。本来は、そのコールバック関数の中で Content-Type を調べて application/xhtml+xml のときだけ変換させるべきなのだが、今回は他の Content-Type を返す php は別のものが使われているので無条件に変換することで逃げた。

header() で設定したレスポンスヘッダの値を後から取得する方法があればいいのだが、ぐぐってもみつからなかった。ご存じの方がいらっしゃたら教えていただきたい。