[PHP] requireでヘッダーを読み込むと、上に空白ができる問題の解決法



問題: index.phpにrequireやincludeでheader.phpを読み込むと、ヘッダーの上に謎の隙間ができる。 解決法: UTF-8をUTF-8Nで保存。

自分が使っているTeraPadには、UTF-8の保存形式に、UTF-8とUTF-8Nの2つあり、UTF-8がBOMつき、UTF-8NがBOMなしです。BOMというのは、そのファイルがUnicodeであると判別できるように、ファイルの先頭につけられるデータのことです。今回このBOMというのが悪さをしていたようです。

以下、Wikipediaから引用。

BOM
バイトオーダーマーク (byte order mark) あるいはバイト順マーク(バイトじゅんマーク)は通称BOM(ボム)といわれる、Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。
Unicode
Unicode(ユニコード)とは、符号化文字集合や文字符号化方式などを定めた、文字コードの業界規格である。文字集合(文字セット)が単一の大規模文字セットであること(「Uni」という名はそれに由来する)などが特徴である。
UTF-8
UTF-8(ユーティーエフはち、ユーティーエフエイト)はISO/IEC 10646(UCS)とUnicodeで使える8ビット符号単位の文字符号化形式及び文字符号化スキーム。 正式名称は、ISO/IEC 10646では‘UCS Transformation Format 8’、Unicodeでは‘Unicode Transformation Format-8’という。両者はISO/IEC 10646とUnicodeのコード重複範囲で互換性がある。RFCにも仕様がある[1]。 2バイト目以降に「/」などのASCII文字が現れないように工夫されていることから、UTF-FSS(File System Safe)ともいわれる。旧名称はUTF-2。 データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向がある。Linuxのように、OSの標準文字エンコードとして使用される例も増えている。
UTF-8とBOM
UTF-8で符号されたテキストデータはエンディアンに関わらず同じ内容になるので、バイト順マーク (BOM) は必要ない。しかし、テキストデータがUTF-8で符号化されていることの標識として、データの先頭にEF BB BF(16進。UCSでのバイト順マークU+FEFFのUTF-8での表現)を付加することが許される。一部のテキスト処理アプリケーション(エディタなど)がこのような動作をする(TeraPad、EmEditorエディタのように付加するかどうかを選択できるものもある)。 なお、日本の特殊事情として、このシーケンスがある方をUTF-8、ない方を特にUTF-8Nと呼ぶこともあるが、このような呼び分けは日本以外ではほとんど知られておらず、また公的規格などによる裏付けもない[10]。 このシーケンスを通常の文字と認識するプログラムでは、先頭に余分なデータがあるとみなされて問題となることがある。例えば、Unix系OSにおける実行可能スクリプトは、ファイル先頭が「#!」から始まるとき、それに続く文字列をインタプリタのコマンドとして認識するが、多くのシステムでは、このシーケンスが存在するとこの機能が働かず実行できない。 逆にこのシーケンスがないとUTF-8と認識できないプログラムも存在する。とくにASCII部以外の文字が少ない場合に誤認することが多い (たとえば、Microsoft Excelでは、CSVファイルを開くとき、このシーケンスが付加されていないUTF-8の場合は正常に読み込むことができない[11]。Microsoft Windowsに付属するメモ帳、ワードパッドも同様。)。

BOMについてなんとなく知ってはいたけど、ここでこういう仕打ちを受けるとは…。Web制作ではUTF-8ではなくてUTF-8Nで保存した方が良さそうですね。今回、色々悩んで調べて3時間くらいで解決。こういったカタルシスは、ゲーム・映画・小説のそれをはるかに凌ぐ…。

スポンサードリンク