BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。但PHP在读取文件时会把这些字符读出,从而形成了文件开头含有一些无法识别的字符的问题。
比如用UTF-8格式保存的生成图片的PHP文件,因为文件头隐藏的BOM信息也被下发,导致生成的图片数据不对,浏览器无法识别。
要检测一个UTF-8文件是否含有BOM信息,就是检测文件开头的字三个符,是否为0xEF, 0xBB, 0xBF。下面这个小程序,用户遍历某个目录下所有文件,并检测是否加了BOM。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//
此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除
//By Bob Shen
$basedir = " . " ; // 修改此行为需要检测的目录,点表示当前目录
$auto = 1 ; // 是否自动移除发现的BOM信息。1为是,0为否。
//以下不用改动
if ( $dh = opendir ( $basedir )) {
while (( $file = readdir ( $dh )) !== false ) {
if ( $file != ' . ' && $file != ' .. ' && ! is_dir ( $basedir . " / " . $file )) echo " filename: $file " . checkBOM( " $basedir / $file " ) . "
" ;
}
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 ( " <span style= " FONT - FAMILY : ; COLOR : red " >BOM found, automatically removed.</span> " );
} else {
return ( " <span style= " FONT - FAMILY : ; COLOR : red " >BOM found.</span> " );
}
}
else return ( " BOM Not Found. " );
}
function rewrite ( $filename , $data ) {
$filenum = fopen ( $filename , " w " );
flock ( $filenum , LOCK_EX);
fwrite ( $filenum , $data );
fclose ( $filenum );
}
//By Bob Shen
$basedir = " . " ; // 修改此行为需要检测的目录,点表示当前目录
$auto = 1 ; // 是否自动移除发现的BOM信息。1为是,0为否。
//以下不用改动
if ( $dh = opendir ( $basedir )) {
while (( $file = readdir ( $dh )) !== false ) {
if ( $file != ' . ' && $file != ' .. ' && ! is_dir ( $basedir . " / " . $file )) echo " filename: $file " . checkBOM( " $basedir / $file " ) . "
" ;
}
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 ( " <span style= " FONT - FAMILY : ; COLOR : red " >BOM found, automatically removed.</span> " );
} else {
return ( " <span style= " FONT - FAMILY : ; COLOR : red " >BOM found.</span> " );
}
}
else return ( " BOM Not Found. " );
}
function rewrite ( $filename , $data ) {
$filenum = fopen ( $filename , " w " );
flock ( $filenum , LOCK_EX);
fwrite ( $filenum , $data );
fclose ( $filenum );
}
将以上代码另存为 checkBOM.php,修改需要检测的目录后运行。这样可能有助于检测是哪个文件带有了BOM信息导致所有页面开头都有那么一段空白。