习惯了用edit plus进行php编程,所以有时会出现一些不为人知的错误,很麻烦;
近日,在开发项目时,某些页面总是出现以下问题:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functions\sessions.php on line 67
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functions\sessions.php on line 67
经过详细搜索,得到以下原因:
我的edit plus中设置了默认的编码为utf-8,且UTF_8签名为:总是添加签名;
于是尝试以下操作:
在edit plus 的工具->参数->文件->UTF_8签名一项中,更改选项"总是添加签名"为"总是移除签名",然后打开index.php文件,并重新另存为,重新运行脚本,终于可以正常了;
另外,在网上找到了两篇比较有参考价值的文章,希望有人碰到此种情况时可以完美解决!
大中小
采用默认的gb2312编码时,兼容Ansi编码,文件头部无任何附加信息,此时session_start()可以正常工作。
采用utf编码时,大部分编辑器都会在在文件头部附加一个BOM块,我的EditPlus附加的是FF FE,用16进制编辑器
可以很清楚的看到。这样,当调用session_start()时,实际上已经向浏览器输出两个字节,只不过是不可见字符浏
览器中出现如下警告:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ......................
解决方法:
1、手动去掉BOM块,可以在16进制编辑器如UltraEdit中编辑,或者采用编辑器自带的功能,好的编辑器一般提供选择是否去除BOM块。
2、自己编写脚本更正,这要针对不同的编辑器,BOM头定义:
UTF-8 EF BB BF
UTF-16 Big Endian FE FF
UTF-16 Little Endian FF FE
UTF-32 Big Endian 00 00 FE FF
UTF-32 Little Endian FF FE 00 00