在网站程序员维护或制作网页的时候,有时候为了方便,会直接右键打开方式直接使用windows自带的记事本来编辑html或php网页文件.
往往修改后会出现页面错位、php运行出错等情况,这是因为win的记事本在保存UTF-8编码的文件时,会自动为修改的文件开头加上隐藏的十六进制0xefbbbf字符。
去除的方法有很多,可以用各种编辑器软件来去除bom也可以使用程序代码直接去除bom.
如:使用较为常见的网页编辑软件dw,即dreamweaver软件
首先用dw打开带有bom信息的文件,然后在菜单栏选择页面属性,找到标题编码选项,将包括Unicode签名(BOM)前面的勾去掉,然后确定保存即可。
或者使用文本编辑器Editplus,选择工具选项,然后找到首选项,选中文件,将UTF-8标识,选择设置为总是删除签名,然后保存即可。
也可以在Linux系统中直接去除bom信息
find . -type f -exec sed -i 's/\xEF\xBB\xBF//' {} \;
使用vim来快速去除bom头
:set encoding=utf-8
:set nobomb
当然,我们也可以使用网页程序来实现,这里以php为例:
<?php
$wenjianjia = "."; //指定目录,.表示当前目录
if ( $wjarr = opendir( $wenjianjia ) ) { //打开目录句柄
while ( ( $mlwj = readdir( $wjarr ) ) !== false ) { //读取目录内容
if ( !is_dir( $wenjianjia . "/" . $mlwj ) ) {
echo "文件名: $mlwj " . bomclean( "$wenjianjia/$mlwj" ) . "<br>";
}
}
closedir( $wjarr ); //释放目录句柄
}
function bomclean( $mlwjname ) {
$wjnr = file_get_contents( $mlwjname ); //读取文件
$checkzf=array();
$checkzf[] = substr( $wjnr, 0, 1 );//第一个字符
$checkzf[] = substr( $wjnr, 1, 1 );//第二个字符
$checkzf[] = substr( $wjnr, 2, 1 );//第三个字符
if ( ord( $checkzf[ 2 ] ) == 191 && ord( $checkzf[ 1 ] ) == 187 && ord( $checkzf[ 0 ] ) == 239 ) { //判断ASCII值
$quchu = substr( $wjnr, 3 ); //去除
$mlwjnum = fopen( $mlwjname, "w" );//打开文件
flock( $mlwjnum, LOCK_EX );
fwrite( $mlwjnum, $quchu );//写入文件
fclose( $mlwjnum );
$xtreturn = "已成功删除BOM信息";
} else {
$xtreturn = "该文件没有bom信息";
}
return $xtreturn;
}
?>
通过以上代码就简单的实现了一个功能为去除bom信息的小工具,它可以去除该文件目录下所有用windows系统自带的记事本修改、保存所产生的bom信息。