BOM: バイト オーダー マーク UTF-8 BOM は UTF-8 シグネチャとも呼ばれ、実際には UTF-8 BOM は UFT-8 には影響しません。UTF-16 をサポートするためです。 、UTF-32 に追加された BOM、BOM 署名は、エディターの識別を容易にするために現在のファイルがどのエンコーディングを使用しているかをエディターに伝えることを意味します。ただし、BOM はエディターには表示されませんが、もう 1 つと同じように出力が生成されます。 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 と SE に依存します SSION によって実装されたすべての関数は無効です。 そのため、テキストファイルを編集・変更する場合は、必ずBOMがランダムに付加されないエディタを使用してください。 Linux 上のエディタではこの問題は発生しません。 Windows では、 メモ帳などのエディタは使用しないでください。推奨されるエディタは次のとおりです。Editplus バージョン 2.12 以降。 UltraEdit (「BOM の追加」の関連オプションをキャンセルする必要があります); Dreamweaver (「BOM の追加」の関連オプションをキャンセルする必要があります) 待って。 BOMが付加されているファイルの場合、キャンセルしたい場合は上記のエディタを使用して一旦保存することができます。 (Editplus は最初に gb として保存し、次に UTF-8 として保存する必要があります。) 、以下はプログラムの解決策です:
[PHP] code<?php $auto = 1; checkdir('C:\project\weibo'); function checkdir($basedir){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if($file{0} == '.') { continue; } if ($file != '.' && $file != '..'){ if (!is_dir($basedir."/".$file)) { echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>"; }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 ("<font color=red>BOM found, automatically removed.</font>"); } else { return ("<font color=red>BOM found.</font>"); } } else return ("BOM Not Found."); } function rewrite ($filename, $data) { $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data); fclose($filenum); } ?>