PHP网页或生成的网页开头一个空行和乱码字符

今天用PHP生成网页,浏览时发现有些问题,就是开头总是空一行和出现几个乱码。一开始我以为是程序的问题,但是在逐步排查之后,并不是程序的原因。这就让人有些疑惑了,一时还不知从哪入手去解决这个问题。

从表面来看,是内容编码问题,但是我在用PHP生成网页时已经尝试过各种编码,UTF-8,gb2312,甚至Unicode都用过,问题照旧。

通过查阅相关资料,有可能是PHP文件的保存编码问题。

我一直用的是Editplus编辑器,保存编码是UTF-8。

于是我换下保存编码,ANSI,不行。

再换,UTF-8 BOM,咦!竟然没问题了!这是咋回事?我一直用UTF-8都不行,用这个UTF-8 BOM竟然可以了!?

我现在还不知这个带BOM与不带BOM的UTF-8有何区别。

但是现在我想我有必要去了解一下了。

UTF-8 BOM 与 UTF-8 的区别

先看图


(点击图片放大)

内容都一样 ,为什么相差了3个字节呢 ? 再看下图 。


(点击图片放大)

多出来的 ef bb bf 就是上面相差三个字节的原因 。

为什么 utf-8 bom 要多这三个字节呢 ?

BOM——Byte Order Mark,就是字节序标记。

bom是为utf-16和utf-32准备的,用于标记字节顺序。微软在utf-8中使用bom是因为这样可以把UTF-8和ASCII等编码区分开来,Windows就是使用BOM来标记文本文件的编码方式的,但这样的文件在Windows之外的操作系统里会带来问题。

PHP与BOM的问题

PHP在设计时就没有考虑BOM的问题,也就是说它不会忽略UTF-8编码的文件开头BOM的那三个字符。由于必须在<?或者<?php后面的代码才会作为PHP代码执行,所以这三个字符将会直接输出。

如果插件的文件有这个问题,将会导致在后台页面里激活或者不激活插件后显示白屏,如果是模版文件有这个问题,将会导致这三个字符直接输出,造成页面上方有一个小空行。——这就解释了为何我用PHP生成的网页开头有个空行乱码了。

国外的英文插件和模版一般都是用的ASCII码的编码方式,不会有BOM,只有国内的插件和模版会由于作者的不知情造成问题。还有,大家修改模版的时候,由于输出页面使用UTF-8编码,那么修改模版的时候如果有加入中文字符的话,必须把文件转成UTF-8编码才能正常显示,这个时候如果所使用的编辑器自动加上了BOM的话,将会造成在页面上输出这三个字符,显示效果就要看浏览器了,一般是一个空行或是一个乱码。

现在各种各样的编辑器,保存文件时如何选择编码格式,也是一大问题,如果选择不对,那么可能对程序的运行就会产生影响,EditPlus保存选utf-8 bom就是文本文件保存时的utf-8