PHPで使う文字コードについて
クラウドシステムソリューション事業部の松永です。
最近部内でPHPの案件の話が出ていたので、
知らないと引っかかりがちな点をご紹介しようと思います。
まずPHPの書き方としては、
<?php
echo 'test';
?>
のように <?php と ?> で囲んだ部分がプログラムとして解釈され、
その他の部分は通常の文字として出力されます。
このため、基本的には通常のhtmlの途中で必要な部分だけPHPを書く、という使い方になります。
また、html以外にも画像なども出力することができます。
詳細は省きますが、下記のように header という関数を使用し、
http通信のヘッダをPHP内で指定します。
<?php
//このファイルが画像であるという指定
header('Content-Type: image/gif');
//画像のバイナリを記述
echo base64_decode('R0lGODlhAQABAPAAAP8AAAAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==');
このheader関数ですが、出力が1文字もない状態で使用しなければいけないという制限があります。
<?php の前に文字を書かなければいいという話なのですが、
実は気づきにくい部分で影響してくるものがあります。
それがファイルの文字コードです。
Shift-JIS や UTF-8 など色々ありますが、UTF-8を使用した場合、
BOMありだと問題になってきます。
使用しているソフトによりますが、ファイルを保存する際にBOMを
つけるかどうかが選べる場合があります。
BOMが何かというのはここでは置いておきますが、
使用するとファイルの先頭に3バイトのフラグが自動的につきます。
実際にバイナリエディタで見てみるとこんな感じです。
(左側の EF BB BF というのがそれです。)
ここで話が元に戻りますが、BOMが <?php の前についてしまうと、
header関数の「出力が1文字もない状態で使用しなければいけない」という条件に反してしまい、
正常に動作しなくなってしまいます。
プログラムの中身だけ見ても異常が見つけられないため、
知らないとハマってしまうことがあります。
header関数以外にもセッションなど、同じ条件のものが色々あるので、
PHPでプログラムを書く際には是非気をつけてみてください。