<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>阿乐的博客 &#187; BOM</title>
	<atom:link href="http://ale.net.cn/blog/tag/bom/feed/" rel="self" type="application/rss+xml" />
	<link>http://ale.net.cn/blog</link>
	<description>没有句号的梦想</description>
	<lastBuildDate>Wed, 22 Dec 2010 14:56:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>关于PHP中的Cannot modify header information的解决问题</title>
		<link>http://ale.net.cn/blog/2009/07/%e5%85%b3%e4%ba%8ephp%e4%b8%ad%e7%9a%84cannot-modify-header-information%e7%9a%84%e8%a7%a3%e5%86%b3%e9%97%ae%e9%a2%98/</link>
		<comments>http://ale.net.cn/blog/2009/07/%e5%85%b3%e4%ba%8ephp%e4%b8%ad%e7%9a%84cannot-modify-header-information%e7%9a%84%e8%a7%a3%e5%86%b3%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 06:49:08 +0000</pubDate>
		<dc:creator>ale</dc:creator>
				<category><![CDATA[网络]]></category>
		<category><![CDATA[BOM]]></category>
		<category><![CDATA[http头]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://ale.net.cn/blog/?p=72</guid>
		<description><![CDATA[刚刚接触php，在做页面定义Header输出的时候碰到了个小问题。
Warning: Cannot modify header information &#8211; headers already sent by (output started at H:\root\&#8230;\a.php:1) in H:\root\&#8230;\b.php on line 11
网上找了下资料说是有可能是因为a.php里面有空格或空行造成，但是全部处理干净后还是有这个问题。
var_dump(headers_list());
显示http头信息如下
array(2) {
  [0]=&#62;
  string(23) &#8220;X-Powered-By: PHP/5.2.3&#8243;
  [1]=&#62;
  string(23) &#8220;Content-type: text/html&#8221;
}
说明a.php有其他内容，只是编辑器没有显示出来。
后来网上找到这篇文章，http://www.cnitblog.com/CoffeeCat/archive/2008/12/15/52629.html。看了之后更加明了。 
摘录如下：
有时候并没有输出任何东西，却还是会出现这个错误，这是因为我们的文件包含了BOM签名。
请看测试代码：
&#60;?php
header(&#8221;content-type:text/html;charset=utf-8&#8243;);
die();
?&#62;
这段代码就是简单的header一下，在&#60;?php之前也没有任何输出，也没有空格，但是网页里还是提示了Cannot modify header information的警告信息。这说明，在&#60;?php之前还有内容，只是编辑器没有显示出来。
我们用ultraEdit打开这个文件，切换到16进制，可以看到，在文本的开头，有EFBBBF，之后才是3C 3F 70 68 70 ( &#60;?php )，说明，在&#60;?php之前，确实存在着输出信息，因此，在修改header的时候，会得到警告信息。

这个EFBBBF是什么东西呢？它的名字叫BOM，Byte Order Mark，是在Windows下的一个约定，用于标记文本是否是Unicode。记事本程序就是通过这三个字节来判断文件是ANSI还是Unicode。
知道了问题发生的原因，下面，我们想办法把BOM去掉。用Dreamweaver打开这个php页面，然后进入页面设置（按Ctrl+J），弹出以下窗口：
   
取消选择“包括Unicode签名（BOM）”，确定就可以了。现在，我们再用UltraEdit打开看这个文件的16进制内容，如下图

可以看到，现在BOM信息已经没有了，文件直接以3C3F70开头了。
最后，我们刷新一下浏览器，发现现在已经没有Warning提示了，问题解决。
]]></description>
			<content:encoded><![CDATA[<p>刚刚接触php，在做页面定义Header输出的时候碰到了个小问题。</p>
<p>Warning: Cannot modify header information &#8211; headers already sent by (output started at H:\root\&#8230;\a.php:1) in H:\root\&#8230;\b.php on line 11</p>
<p>网上找了下资料说是有可能是因为a.php里面有空格或空行造成，但是全部处理干净后还是有这个问题。</p>
<p>var_dump(headers_list());</p>
<p>显示http头信息如下</p>
<p>array(2) {<br />
  [0]=&gt;<br />
  string(23) &#8220;X-Powered-By: PHP/5.2.3&#8243;<br />
  [1]=&gt;<br />
  string(23) &#8220;Content-type: text/html&#8221;<br />
}</p>
<p>说明a.php有其他内容，只是编辑器没有显示出来。</p>
<p>后来网上找到这篇文章，<a href="http://www.cnitblog.com/CoffeeCat/archive/2008/12/15/52629.html">http://www.cnitblog.com/CoffeeCat/archive/2008/12/15/52629.html</a>。看了之后更加明了。 </p>
<p><strong>摘录如下：</strong></p>
<p>有时候并没有输出任何东西，却还是会出现这个错误，这是<span style="FONT-WEIGHT: bold">因为我们的文件包含了BOM签名</span>。</p>
<p>请看测试代码：</p>
<p>&lt;?php<br />
header(&#8221;content-type:text/html;charset=utf-8&#8243;);<br />
die();<br />
?&gt;</p>
<p>这段代码就是简单的header一下，在&lt;?php之前也没有任何输出，也没有空格，但是网页里还是提示了Cannot modify header information的警告信息。这说明，在&lt;?php之前还有内容，只是编辑器没有显示出来。</p>
<p>我们用ultraEdit打开这个文件，切换到16进制，可以看到，在文本的开头，有EFBBBF，之后才是3C 3F 70 68 70 ( &lt;?php )，说明，在&lt;?php之前，确实存在着输出信息，因此，在修改header的时候，会得到警告信息。</p>
<p><img src="http://www.cnitblog.com/images/cnitblog_com/coffeecat/modifyheader/bom.JPG" alt="" width="651" height="80" /></p>
<p>这个EFBBBF是什么东西呢？它的名字叫BOM，Byte Order Mark，是在Windows下的一个约定，用于标记文本是否是Unicode。记事本程序就是通过这三个字节来判断文件是ANSI还是Unicode。</p>
<p>知道了问题发生的原因，下面，我们想办法把BOM去掉。用Dreamweaver打开这个php页面，然后进入页面设置（按Ctrl+J），弹出以下窗口：<br />
   <img src="http://www.cnitblog.com/images/cnitblog_com/coffeecat/modifyheader/snap4.JPG" alt="" width="600" height="352" /></p>
<p>取消选择“包括Unicode签名（BOM）”，确定就可以了。现在，我们再用UltraEdit打开看这个文件的16进制内容，如下图</p>
<p><img src="http://www.cnitblog.com/images/cnitblog_com/coffeecat/modifyheader/nobom.JPG" alt="" width="647" height="71" /></p>
<p>可以看到，现在BOM信息已经没有了，文件直接以3C3F70开头了。</p>
<p>最后，我们刷新一下浏览器，发现现在已经没有Warning提示了，问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://ale.net.cn/blog/2009/07/%e5%85%b3%e4%ba%8ephp%e4%b8%ad%e7%9a%84cannot-modify-header-information%e7%9a%84%e8%a7%a3%e5%86%b3%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

