本文目錄一覽:
如何使用PHP批量去除文件UTF8 BOM信息
原理:
UTF8文件,微軟為了增加一個識別信息,有了BOM這個東西:BOM —— Byte Order Mark,預設在Windows等平台上編輯的UTF8文件會在頭部增加3個位元組的標記信息,我們PHP引擎在處理的時候會完整讀取整個PHP代碼文檔, 如果PHP文件頭部包含BOM信息,就會輸出一個空白,在很多時候會帶來問題,比如我們session無法工作、cookie無法設置等等問題。
解決方法:
把頭部BOM的3個位元組信息識別出來,然後剔除掉。不過一般情況我們不知道哪個文件有BOM,或者是有很多文件,這個時候,就需要進行批量處理了,下面代碼主要就是展現了批量處理的情況,應該會對大家工作中有幫助。
執行方法:
設置一個路徑,然後直接執行就行。
複製代碼 代碼如下:
?php
// 設定你要清除BOM的根目錄(會自動掃描所有子目錄和文件)
$HOME = dirname(__FILE__);
// 如果是Windows系統,修改為:$WIN = 1;
$WIN = 0;
?
!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “”
html xmlns=””
head
meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ /
titleUTF8 BOM 清除器/title
style
body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
.FOUND { color: #F30; font-size: 14px; font-weight: bold; }
/style
/head
body
?php
$BOMBED = array();
RecursiveFolder($HOME);
echo ‘h2These files had UTF8 BOM, but i cleaned them:/h2p class=”FOUND”‘;
foreach ($BOMBED as $utf) { echo $utf .”br /n”; }
echo ‘/p’;
// 遞歸掃描
function RecursiveFolder($sHOME) {
global $BOMBED, $WIN;
$win32 = ($WIN == 1) ? “” : “/”;
$folder = dir($sHOME);
$foundfolders = array();
while ($file = $folder-read()) {
if($file != “.” and $file != “..”) {
if(filetype($sHOME . $win32 . $file) == “dir”){
$foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
} else {
$content = file_get_contents($sHOME . $win32 . $file);
$BOM = SearchBOM($content);
if ($BOM) {
$BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
// 移出BOM信息
$content = substr($content,3);
// 寫回到原始文件
file_put_contents($sHOME . $win32 . $file, $content);
}
}
}
}
$folder-close();
if(count($foundfolders) 0) {
foreach ($foundfolders as $folder) {
RecursiveFolder($folder, $win32);
}
}
}
// 搜索當前文件是否有BOM
function SearchBOM($string) {
if(substr($string,0,3) == pack(“CCC”,0xef,0xbb,0xbf)) return true;
return false;
}
?
/body
/html
望採納。
PHP批量刪除、清除UTF-8文件BOM頭的代碼實例
記得運行代碼前先把文件備份一下哦,避免出現失敗問題。
代碼一:
複製代碼
代碼如下:
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=redBOM
found,
automatically
removed./font”);
}
else
{
return
(“font
color=redBOM
found./font”);
}
}
else
return
(“BOM
Not
Found.”);
}
代碼二:
複製代碼
代碼如下:
?php
header(‘content-Type:
text/html;
charset=utf-8′);
if(isset($_GET[‘dir’])){
//設置文件目錄,如果沒有設置,則自動設置為當前文件所在目錄
$basedir=$_GET[‘dir’];
}else{
$basedir=’.’;
}
$auto=1;/*設置為1標示檢測BOM並去除,設置為0標示只進行BOM檢測,不去除*/
echo
‘當前查找的目錄為:’.$basedir.’當前的設置是:’;
echo
$auto?’檢測文件BOM同時去除檢測到BOM文件的BOMbr
/’:’只檢測文件BOM不執行去除BOM操作br
/’;
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).’
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並已自動去除/font’);
}else{
return
(‘
font
color=red找到BOM/font’);
}
}else{
return
(‘
沒有找到BOM’);
}
}
function
rewrite($filename,$data){
$filenum=fopen($filename,’w’);
flock($filenum,LOCK_EX);
fwrite($filenum,$data);
fclose($filenum);
}
?
php檢測文件是否有bom頭代碼
?php
/*檢測並清除BOM*/
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);
}
}
}//end while
closedir($dh);
}//end if($dh
}//end function
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=redBOM found, automatically removed./font”;
}else{
return (“font color=redBOM found./font”);
}
}
else return (“BOM Not Found.”);
}//end function
function rewrite($filename, $data){
$filenum = fopen($filename, “w”);
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}//end function
?
檢測文件是否有bom頭
方法一:用Ultraedit或Editplus打開PHP文件,另存為無Bom的utf-8文件方法二:用Dreamweaver去除Bom頭
菜單–修改–頁面屬性 或者ctrl+j打開頁面屬性窗口,點選「標題/編碼」去掉「包括Unicode簽名Bom」前的勾
有Bom的文件太多?這樣太麻煩?當然有更好的方法!方法三:用php文件批量去除bom頭 將以下這段代碼保存為php文件,上傳到伺服器,用瀏覽器訪問它!?phpif (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 (font color=redBOM found, automatically removed./font);} else {return (font color=redBOM found./font);}}else return (BOM Not Found.);}function rewrite ($filename, $data) {
$filenum = fopen($filename, w);
flock($filenum, LOCK_EX);
fclose($filenum);}?還用記事本保存?那你真是智商捉急了!
原創文章,作者:YUUSK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/329542.html