PHP は BOM ヘッダー コードを削除します
UTF-8 BOM は UTF-8 署名とも呼ばれます。実際、UTF-8 BOM は UTF-16 と UTF-32 をサポートするために追加されます。エディターによる識別を容易にするために、エディターで現在のファイルにどのエンコーディングが使用されているかをエディターに伝えます。ただし、BOM はエディターに表示されませんが、追加の空白行
と同様の出力が生成されます。PHP ファイルを変更した後にこの問題が発生する場合:
* ログインまたはログアウトできません
* ページの上部に空白行が表示されます。
* ページの上部にエラー警告が表示されます。
※その他異常事態。
このプログラムは UTF-8 エンコーディングを使用します。ほぼすべてのテキスト編集ソフトウェアは、UTF-8 でエンコードされたファイルを表示および編集できるようになりました。しかし、残念ながら、それらの多くはパフォーマンスが良くありません。
Windows に付属のメモ帳などのソフトウェアは、UTF-8 でエンコードされたファイルを保存するときに、ファイルの先頭に 3 つの非表示文字 (0xEF 0xBB 0xBF、または BOM) を挿入します。これは、メモ帳などの編集者がファイルが UTF-8 でエンコードされているかどうかを識別できるようにするために使用される隠し文字の文字列です。通常のファイルの場合は問題ありません。しかし、PHP の場合、BOM が問題になります。
PHP は BOM を無視しないため、これらのファイルの読み取り、組み込み、または参照の際、BOM はファイルの先頭テキストの一部として使用されます。組み込み言語の特性上、この文字列が直接実行(表示)されます。その結果、ページの上部パディングを 0 に設定しても、HTML の先頭にこれらの 3 文字があるため、Web ページ全体をブラウザの上部近くに配置することはできません。
最大の問題はこれではありません。 COOKIE 送信メカニズムの制限により、ファイルの先頭に BOM がすでに存在するファイルでは、COOKIE を送信できません (COOKIE が送信される前に PHP がファイル ヘッダーを送信しているため)。関数が無効です。 COOKIE および SESSION に依存する関数はすべて無効です。
そのため、テキストファイルを編集・変更する場合は、必ずBOMがランダムに付加されないエディタを使用してください。 Linux 上のエディタではこの問題は発生しません。 WINDOWSではメモ帳などのエディタは使用しないでください。推奨されるエディターは、Editplus バージョン 2.12 以降、EmEditor、UltraEdit (「BOM の追加」の関連オプションをキャンセルする必要があります)、Dreamweaver (「BOM の追加」の関連オプションをキャンセルする必要があります) などです。
BOM が追加されたファイルの場合、キャンセルしたい場合は、上記のエディターを使用して一度保存できます。 (Editplus は最初に gb として保存し、次に UTF-8 として保存する必要があります。)、プログラムの解決策は次のとおりです:
if (isset ($_GET['dir'])) { //设置文件目录 $basedir = $_GET['dir']; } else { $basedir = '.'; } $auto = 1; checkdir($basedir); function checkdir($basedir) { if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..') { if (!is_dir($basedir . "/" . $file)) { echo "filename: $basedir/$file " . checkBOM("$basedir/$file") . " "; } else { $dirname = $basedir . "/" . $file; checkdir($dirname); } } } closedir($dh); } } function checkBOM($filename) { global $auto; $contents = file_get_contents($filename); $charset[1] = substr($contents, 0, 1); $charset[2] = substr($contents, 1, 1); $charset[3] = substr($contents, 2, 1); if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) { if ($auto == 1) { $rest = substr($contents, 3); rewrite($filename, $rest); return ("BOM removed."); } else { return ("BOM found."); } } else return ("BOM Not Found."); } function rewrite($filename, $data) { $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data); fclose($filenum); }