メニュー

社員ブログ

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を
つけるかどうかが選べる場合があります。

editor_encode

BOMが何かというのはここでは置いておきますが、
使用するとファイルの先頭に3バイトのフラグが自動的につきます。
実際にバイナリエディタで見てみるとこんな感じです。
(左側の EF BB BF というのがそれです。)

test_bom

ここで話が元に戻りますが、BOMが <?php の前についてしまうと、
header関数の「出力が1文字もない状態で使用しなければいけない」という条件に反してしまい、
正常に動作しなくなってしまいます。

プログラムの中身だけ見ても異常が見つけられないため、
知らないとハマってしまうことがあります。

header関数以外にもセッションなど、同じ条件のものが色々あるので、
PHPでプログラムを書く際には是非気をつけてみてください。