移除PHP中BOM的方法

Leave a Comment»

php

PHP...还真麻烦,尤其是在Win主机下

  好兄弟友情支持的虚拟主机最近老出问题,仔细询问了缘由,看来还是技术维护人员不到位造成,且服务器是Win2003+IIS,不稳定之余对PHP的支持也存在些微的问题. 不想去埋怨什么,期待早点完成维护即可.

  今天上午挺意外的发现服务器恢复,但我的Movie Castle页面显示却很奇怪...全屏,且上方多了一行小空行,测试浏览器为IE7.然后去Firefox下查看,发现页面的Width正常,但上方的小空行依然存在-.-

  我是善于Google的人,于是遇到不明白的先询问这本百科全书. 得到的答案是主题PHP文件编码是UTF-8 with bom造成的,至于这个bom是什么,看下这个中文解释吧.

  在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

  UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

  Windows就是使用BOM来标记文本文件的编码方式的。

 

  很显然...我的小空行是因为这个bom而产生的.

  找到问题后的就是解决问题.去WP群里问了声,得到了一些建议,但个人觉得CSS样式之前在相同的环境下没有一点问题,没理由现在突然显示不了! 还是先解决已知问题吧...Google告诉我了很多去除bom的方法,但操作上来讲都有点烦,最后终于找到了个称心如意滴~muhahaha 一个自动移除bom的小程序...备份后大胆的试用,果然问题立刻解决.

 
  

<?php
//remove the utf-8 boms
//by magicbug at gmail dot com

if (isset($_GET['dir'])){ //config the basedir
	$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);
}
?>

 

步骤:

1.Copy代码到txt文档中,保存成php后缀的文件,命名为111.php

2.将111.php放在网站根目录下

3.打开浏览器,执行http://root/111.php

4.一切困扰都解决鸟...空行没了,CSS样式也显示正常了.

 

  撰文留念之...用这个方法可远比将php文件一个个另存为utf-8 without bom方便呢!!!

本日志现有 35 条精彩评论 | Leave a Comment»
  1. Yacca said in 2008.05.07 23:21: Reply

    大猫幸福的和小fhappy呢...
    也就是说 你和大猫 小f合租...

  2. Yacca said in 2008.05.07 23:22: Reply

    Permalink Redirect WordPress Plugin
    ...地址上面给出了.

  3. Yacca said in 2008.05.07 23:23: Reply

    别困扰这种东西么,不碍眼的.

  4. homer said in 2008.05.07 23:47: Reply

    哈哈 貌似 偶也不管了 反正他那出问题了我这里也差不多也完蛋,他如果有解决方案我就跟着他来。省时又省力哈哈。。

  5. Yacca said in 2008.05.08 0:03: Reply

    省力...免费的技术维护

  6. chada said in 2008.05.08 7:27: Reply

    The moment I saw "how about we get a relationship?":(shocked) wat? yacca is a gay?!!!

    haha~then I saw "blogroll" I knew that I've made a mistake^^

  7. chada said in 2008.05.08 7:28: Reply

    还是不要更换了,毕竟已经做了一段时间了,更改之后会造成大量搜索引擎死链接,对排名不利。

  8. chada said in 2008.05.08 7:31: Reply

    收藏之,说不定哪天就用到了,哇呜哇呜

  9. Yacca said in 2008.05.08 10:56: Reply

    ^^

  10. Yacca said in 2008.05.08 10:57: Reply

    不换...主要是觉得这没什么-.-

  11. Yacca said in 2008.05.08 10:59: Reply

    ...faint-.-

  12. schuen said in 2008.05.09 3:54: Reply

    现在ok了.. :-)

  13. Yacca said in 2008.05.09 10:46: Reply

    恩那 去数据库里直接删的...-.-

  14. Lucifr said in 2008.05.21 12:08: Reply

    用到了,非常感谢~~

  15. Yacca said in 2008.05.21 12:28: Reply

    ^^ 没什么,经验么 就是拿来分享的.


评论是一种美德,请您务必身体力行! | Back To Top»

Copyright© 2007-2009 Since 2007.12.24 | Skin by BlogOhBlog, Modify by Yacca | Hosting by WopusIDC | Stats