一時的に出力文字コードを変換する
PHPはその機能で出力を各種文字コードに自動変換して出力することができる。例えばLinux使いなプログラマが、社内システムなんかを構築する場合、通常のサイトやデータベースはEUCで作ったとしても何の問題もないが、CSVファイルをダウンロードさせるような仕組みを作る場合はShift_JISにテキスト変換してやらないと、誰もそのファイルをエクセルで開くことができなくなる。
以下のコードを出力に際して書き込んでやればよい。
mb_http_output(‘SJIS’);
ob_start(‘mb_output_handler’);
珍しく上記2行の意味を考えてみた。
1行目は出力をSJISにしましょう、ということだ。しかしそれだけではだめ。つまり「SJISにしましょう」ということではなく、「SJISにしたいです」という宣言でしかない。これを実行するのが2行目。
ob_startというのはバッファリングを有効にするための関数だ。つまりprint構文などが呼ばれた場合に逐一ブラウザに出力するのではなく、サーバ側で全てのPHP処理が完了するまで待ちましょう、という関数だ。で、その引数で指定されているmb_output_hander。これはいわゆるコールバック関数というやつだ。コールバック関数とは、親関数(ここではob_start)が呼ばれた際に、そのついでに処理してくれ、というような関数だ(突き詰めて書けば違うけど、おおむねこんな感じ)。
mb_output_handerはコールバック専門の関数でob_startによって出力バッファにためられたデータを、出力用文字コードに変換するという機能を持つ。ということで上記2行のプログラムは、1行目で「出力をSJISにしたい」と宣言し、2行目のob_startで、出力をいったんバッファにためる、と設定し、mb_output_handerでバッファ内の文字列を指定どおりに文字コード変換する、という処理をすることになる。
なおmb_output_handerはいろいろ条件があって、header関数でcontent-typeを出力していない、とか、もし設定されていた場合はtext/で始まるmimeが指定されている、とかある。もちろんhttp_outputがpassに設定されていたら変換のしようがないのは言うまでもない。
ということで諸々制約が多い。プログラム書き始めの人にとってはかなり使いにくい関数といえる(理屈を考えず、2行書いておけばいいという話もあるが・・・)。