在网站页面使用utf-8 的情况下,有时候被包含(include)的页面上面显示一行空白,而用记事本打开也开不见任何东西,发生这种情况的原因是由于UTF-8 文件的Unicode签名BOM( Byte Order Mark )的问题。
BOM(Byte Order Mark ),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8 就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8 编码的。微软做这种检测,但有些软件不做这种检测, 而把它当作正常字符处理。
微软在自己的UTF-8 格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8 的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8 文本文件做个这样的标记。
也 就是说一个UTF-8 文 件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模 式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8 还是ANSI,如果是ANSI则不带BOM。
解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8 。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了
BOM引起的网页布局混乱
今天测试网站的时候,发现在本地测试着好好的页面,放到服务器上去测试的时候,首页布局却混乱不已,页面的上部比正常状态下多出一块空白,而且整个页面的布局完全是混乱的。
一开始以为是服务器上文件版比本地的文件版本旧的原因,比对了一番没找到不同的,然后想到会不会是文件编码的问题。
切换到Zend Studio,找到首页的模板文件,属性里一看,编码UTF-8 ,对的,但是下面一行字引起了我的注意,“Byte Order Mark is UTF-8 (BOM)”,于是就想是不是这个玩意引起的布局混乱。
打开EditPlus,设置文件保存选项为一直删除BOM,打开首页模板,保存,上传,测试,没有问题!
看来果然是BOM的问题了,接下来的事就比较机械了,在模板文件里看哪些是带了BOM的,直接到EditPlus里走一遭就行了。
解决了这个问题才想起来,有些模板为了转换成UTF-8 编码的,就用记事本打开文件,然后另存为UTF-8 编码了,但是记事本是会给UTF-8 编码的文件加上BOM的,因此就引起了首页布局的混乱。
嗯,问题解决,就这样。