先日、PHPでテキストファイルに記録されたテキストデータ(ファイル名群)を読み込み、得られたデータに則ってファイルを書き込みする処理を書いていたのですが、UTF-8のBOM付テキストにしてやられました。
まず、BOMとは何かですが、文字コードがUTF-8の場合に識別のため、ファイルの先頭に3バイト(0xEF 0xBB 0xBF)が追加されることを指します。
Windowsのメモ帳などでテキストファイルを編集すると必ずこのBOMデータが必ず付加されるそうです。
このBOMデータの存在に気づかずファイル名の読み込み→ファイル作成を行ったところ、見た目は普通のファイル名のファイルなのですが、Linux上で見ると同じファイル名が2つ。。。
<例>
# ll
test.txt ←実はファイル名頭にBOMがある
test.txt ←こっちはまともなファイル名
しかも、たちが悪いのが片方のファイルはファイル名が特定できないため、アクセス不可能というもの。。。 私の場合は、samba経由でファイルを削除しました。
インターネットで調べると意外と多くの方がBOMデータで同様のミスをしていることが判明しました。調べた限りだとPHP特有の問題っぽい感じ。
で、PHPでのBOMデータ削除の方法ですが、以下の方法で削除が可能です。
$fileName = "開くファイル名"; // 開くファイル名 $pointer = fopen($fileName, "r"); // ファイルを開く $value = fgets($pointer); $value = rtrim($value); // 改行コード除去 if($value == NULL) { break; } // BOMを取り除く処理 if($value[0] == chr(0xef) && $value[1] == chr(0xbb) && $value[2] == chr(0xbf)) { // UTF-8 BOMを取り除く $value = substr($value, 3); }
私はこれに気づくまで半日無駄にかかってしまいました。この記事が皆さんの半日分の調査を節約することができれば幸いです。
コメント