ホームページ >バックエンド開発 >PHPチュートリアル >PHPでBOMヘッダーをクリア
BOM: バイト オーダー マーク
UTF-8 BOM は UTF-8 署名とも呼ばれます。実際、UTF-8 BOM は UTF-16 および UTF-32 をサポートするために追加されます。 ,BOM 署名の意味は、編集者の識別を容易にするために現在のファイルがどのようなエンコーディングを使用しているかをエディターに伝えることです。ただし、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 以降、UltraEdit (「BOM の追加」の関連オプションをキャンセルする必要があります)、「BOM の追加」の関連オプションをキャンセルする必要があります。
BOM が追加されたファイルの場合、キャンセルしたい場合は、上記のエディターを使用して一度保存できます。 (Editplus はまず gb として保存し、次に UTF-8 として保存する必要があります。)、プログラムの解決策は次のとおりです:
Php code
// utf-8 boms を削除します
}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 "ファイル名: $basedir/
$file ".checkBOM("$basedir/$file")."
";
}else{
$dirname = $basedir."/".
$file ;
checkdir($dirname);
}
}
}
Closedir($dh);
}
}
function checkBOM ($filename) {
$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 が見つかりました、
自動的に削除されました。");
} else {
return ("BOM が見つかりました。
");
}
}
else return ("BOM が見つかりません。");
}
関数書き換え ($ファイル名, $data) { $filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
? >