Memorize the past: | My Live Space |

移除PHP中BOM的方法

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方便呢!!!


随机日志

  


33 Responses to “移除PHP中BOM的方法”

  1. g.zhen.ning

    yeah,congratulation your blog come back!
    how about we get a relationship?(add blogroll each other)

    [回复]

    Yacca reply on 2008.05.06:

    no problem, done~~~^^

    [回复]

    chada reply on 2008.05.08:

    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^^

    [回复]

    Yacca reply on 2008.05.08:

    ...faint-.-

  2. g.zhen.ning

    done! :-D

    [回复]

  3. !CnSoLoer

    下个插件,把地址中的index.php去掉

    [回复]

    Yacca reply on 2008.05.07:

    搜索不到...用了插件后会不会引起之前的链接失效呢?还是会自动跳转的!?

    [回复]

    chada reply on 2008.05.08:

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

    Yacca reply on 2008.05.08:

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

  4. schuen

    我用FF, CSS貌似不正常耶

    [回复]

    Yacca reply on 2008.05.07:

    -o- 现在呢...昨晚是夸张的可以 我发现了的
    walle的文章都发了4篇...靠.

    [回复]

    schuen reply on 2008.05.09:

    现在ok了.. :-)

    Yacca reply on 2008.05.09:

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

  5. 阿草哥

    怎么侧边栏 去下面了啊 可能是内容中宽度的原因

    [回复]

    Yacca reply on 2008.05.07:

    嗯...代码.
    代码是wlw生成的,无法自动换行-.-

    [回复]

  6. homer

    赶快换LIUNX服务器吧。
    我开头也装载我的 WIN虚拟主机下 结果问题 多多 可视化编辑和上传都不能正常使用。。。

    [回复]

    Yacca reply on 2008.05.07:

    -o- 看机会吧,再挂个一天时,和兄弟开口说迁移...

    [回复]

  7. !CnSoLoer

    Linux Apache服务器可以通过.htaccess文件的rewrit功能实现,这个应该在安装的时候都会西东把规则写到.htaccess里面去的。
    所以看来你的应该是Windows的服务器。之前我也有个博客是这样的,我也没在意,突然有一天我修改了永久链接的格式,所以以前的链接全失效了。网上有人说有一个301转向的插件,我装了可以用,就是把原来的链接全转向到新的链接上面去,两个链接都可以访问,那个插件还有两个附属的功能关于www和不带www都能访问的,以及去index.php的。
    但是很遗憾,现在找不到了。我刚刚找了半天也没有找到。

    [回复]

    Yacca reply on 2008.05.07:

    那算了吧...这url是长了点,但这么久下来了,习惯鸟~~^^

    [回复]

    lxltop reply on 2008.05.07:

    其实你说的那个插件就是这个,是一个不错的插件,我也启用了的。
    http://www.imxl.net/tattleskill/wordpress-25-bug/

    [回复]

    Yacca reply on 2008.05.07:

    去你那里瞄了眼,知道这是什么了...之前看到过的

  8. 9NPC

    不错不错。收藏咯~
    我现在用FIREFOX访问你的网站。发现宽度还是有问题哦。

    [回复]

    Yacca reply on 2008.05.07:

    我这里是ff...1280*800的分辨率...

    没问题-.-

    [回复]

  9. homer

    我现在用和大猫他们合租的服务器 感觉不错。。。
    你问他看看。。

    [回复]

    Yacca reply on 2008.05.07:

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

    [回复]

    homer reply on 2008.05.07:

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

    Yacca reply on 2008.05.08:

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

  10. yaozhch

    什么插件可以把URL中的INDEX.php去掉啊 ?
    一直想去掉它。。。。。。

    [回复]

    Yacca reply on 2008.05.07:

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

    [回复]

  11. 香草与叹息

    恩,这个问题曾经困扰过我。。。

    [回复]

    Yacca reply on 2008.05.07:

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

    [回复]

  12. chada

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

    [回复]

    Yacca reply on 2008.05.08:

    ^^

    [回复]

Leave a Reply