检查PHP文件头BOM
?
??前些日子本地文件上傳到服務器上,某些文件頭部總是出現一條空白,無論怎么修改文件都無法去除空白,用firebug查看header部分同樣有一片空白,刪除后空白消失,但是在文件里卻無法找到那個空白的部分,糾結了好久也沒解決;昨天則是后臺登陸后顯示空白,用的是frameset,單獨使用某個部分內容是可以顯示的,但是在后臺首頁index.php下用frameset卻無法顯示,今天上網查了下,剛好有一個帖子也是說frameset無法顯示的問題,有談到是PHP頭文件BOM的影響,之前也了解過PHP頭部BOM,知道自己應該是找到問題的答案了(之前的頭部空白也是),便查了一下相關BOM的資料.
BOM頭
BOM: Byte Order Mark
UTF-8 BOM又叫UTF-8?簽名,其實UTF-8?的BOM對UFT-8沒有作用,是為了支援UTF-16,UTF-32才加上的BOM,BOM簽名的意思就是告訴編輯器當前文件采用何種編碼,方便編輯器識別,但是BOM雖然在編輯器中不顯示,但是會產生輸出,就像多了一個空行,
?
如果您在修改任何PHP文件後發生:
*?頁頂出現一條空白; * frameset無法正常顯示(單獨使用可以); *?不能登入或者不能登出; *?頁頂出現錯誤警告; *?其它不正常的情況.
?
這些大部分是編輯器的問題,PHP文件采用UTF-8編碼,PHP開發大部分使用的文本編輯軟件如:Zend studio、editplus、eclipse等等都可以顯示并編輯UTF-8編碼的文件,但是也有一些軟件不能滿足這個要求.
類似如windows的記事本,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM).它是一串隱藏的字符,用于讓記事本等編輯器識別這個文件是否以UTF-8編碼.對于一般的文件,這樣并不會產生什么麻煩.但對于?PHP來說,BOM是個大麻煩.
對于BOM,PHP并不會忽略,在讀取、包含或者引用這些文件時,PHP會把BOM作為文件開頭正文的一部分,根據嵌入式語言的特點,這串字符將被直接執行(顯示)出來.這就導致了一些頁面的頭部總是有一條白條,盡管樣式padding、margin等各方面都設置好也無法讓整個網頁緊貼瀏覽器頂部,這頭部白條就是這3個不可見的字符(0xEF 0xBB 0xBF,即BOM);
另外還有的問題就是,受COOKIE送出機制的限制,在這些文件開頭已經有BOM的文件中,COOKIE無法送出(因為在COOKIE送出前PHP已經送出了文件頭),所以登入和登出功能失效.一切依賴COOKIE、SESSION實現的功能全部無效.
所以,在編輯、修改任何文本文件的時候,請使用不會亂加BOM的編輯器.Linux下的編輯器應該都沒有這個問題.WINDOWS下,請勿使用記事本等編輯器.推薦使用Editplus,Zend studio、eclipse等編輯器.
其他的對于已經添加了BOM的文件,要取消的話,可以用不會亂加BOM的編輯器另存一次.當然也可以使用以下方法去除該目錄下所有文件的頭部BOM:
?
把以下代碼復制到一個PHP文件里面,運行該PHP文件,就可以批量清除該文件相同目錄下所有文件的頭部BOM.
<?php 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")." <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); } ?>指定目錄或文件清除BOM:<?phpif(isset($_GET['dir']) && !empty($_GET['dir'])){ //設置文件目錄 $basedir=$_GET['dir']; }else{ $basedir = '.'; } if(empty($_GET['filename'])){ //設置文件 $auto = 1; checkdir($basedir); }else{$file = $_GET['filename'];echo "filename: $basedir/$file ".checkBOM("$basedir/$file")." <br>";}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")." <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); } ?>?
?
轉載于:https://www.cnblogs.com/sunscheung/p/4493187.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的检查PHP文件头BOM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: aspcms简介
- 下一篇: php5.3连接sqlserver200