设为首页 收藏本站
查看: 377|回复: 0

[经验分享] PHP的UTF-8 BOM引起的问题

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2017-4-6 08:57:27 | 显示全部楼层 |阅读模式
  习惯了用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文件,并重新另存为,重新运行脚本,终于可以正常了;
  另外,在网上找到了两篇比较有参考价值的文章,希望有人碰到此种情况时可以完美解决!
  
一个UTF-8 BOM引起的PHP的诡异问题2007-06-30 14:29一、
  //---a.php
<?php
header("Content-Type: image/BMP");
session_start();
................
?>
将a.php保存为utf-8格式,结果用浏览器访问这个php文件,就会出现如下错误:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started
  at ×××.php:1) in ×××on line 2
  这个问题很常见,多数是因为在session_start之前有输出了!对于老鸟来说,这个错误基本上不会发生,但是如果你是用DW或是editplus等编
  辑器写代码的,连高手也有可能发生这个错误!
  如上面的提示:在第×××文件的第1行,×××文件的第2行,随你看,这两处是不会有任何输出语句的,很奇怪还是会出错,为什么呢
原来:
  Unicode 签名 (BOM) 可在文档中包括字节顺序标记 (BOM)。BOM 是位于文本文件开头的 2 到 4 个字节,可将文件标识为Unicode,如果是这
  样,还标识后面字节的字节顺序。由于 UTF-8 没有字节顺序,因此可以选择添加 UTF-8 BOM。对于 UTF-16 和 UTF-32,这是必需的。
看见没有!如果选了这个选项,就会在页面的最前面输出2到4个字节!
  而 session_start() 要求之前没有任何输出给客户端浏览器
  
二、
  另外还有一个地方可能会出错,例如:
/--a.php--
?>
空行
空行
  如果你包含a.php之后再来也会有这个问题,通常的建议是经常被包含的文件末尾不要有?>
  又如:
在调用Session_Start()之前不能有任何输出.例如下面是错
误的.
==========================================
1行
2行<?PHP
3行 Session_Start();//之前在第一行已经有输出
4行.....
5行?>
==========================================
  已经经过试验,事实确实是如此诡异。
三、
  session_start()
set_cookie()
header()
前面都加上@应该可以抑制这个警告。
  
四、
  在editplus编辑器中,如果先把utf-8的a.php文件转换为gb2312或是其他,然后再转换为utf-8这样就可以成功访问了,也就是说文件开头的
  BOM被去掉了,这时候的UTF-8 是无BOM类型的了
  
PHP-关于utf-8编码问题引起的session_start()错误

2007-02-15 14:55:01

大中小
采用默认的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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360813-1-1.html 上篇帖子: 确保PHP安全 不能违反的四条安全规则 下篇帖子: GD库函数大全 php GD库函数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表