热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一个bom头引发的血案

2019独角兽企业重金招聘Python工程师标准

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  1.   
  2. session_start();  
  3.   
  4. $_SESSION['test'] = 'test';  
  5.   
  6. $_SESSION['name'] = 'name';  
  7.   
  8. $data = serialize($_SESSION);  
  9.   
  10. ...更多后续代码  
  11.   
  12. ?>  


 

没有问题,很简单的一段设置session的代码。

但是运行后却报错:

Cannot send session cache limiter - headers already sent (output started at...) on line ...

报错信息很明显,就是在session_start()之前有了输出,导致后面的header发送失败。

因为很多情况下

仔细检查一下,没有空格,没有echo ,没有print等导致输出的问题,那么到底是什么问题呢?

应该有很多人都想到了,bom头。

对,这里就是bom头搞的鬼。

那么什么是bom头呢?

 

 

[plain] view plain copy

 

  1. BOM: Byte Order Mark  
  2. 就是一个字节顺序标签,类似一个标记,又叫签名,   
  3.   
  4. BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。  
  5. 一般的编码集中并不会出现bom头,unicode编码集中会出现。  
  6. 常见的bom头是:【摘录自:http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html】  
  7.   
  8.   UTF-8    ║ EF BB BF   
  9.   UTF-16LE ║ FF FE (小尾)  
  10.   UTF-16BE ║ FE FF (大尾)  
  11.   UTF-32LE ║ FF FE 00 00   
  12.   UTF-32BE ║ 00 00 FE FF  
  13.   
  14. 为什么bom头会产生乱码?  
  15.   
  16. 【摘录自:http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html】  
  17.   
  18. 有bom头的存储或者字节流,它一定是unicode字符集编码。到底属于那一种(utf-8还是utf-16或是utf-32),通过头可以判断出来。  
  19.   
  20. 由于已经说过utf-16,utf-32不指定bom头,解析程序默认就认为是ansi编码,出现乱码。而utf-8指定或者不指定程序都可判断知道对于的字符集编码。  
  21.   
  22. 问题就出在这里,可能有的应用程序(ie6浏览器),它就认为如果utf-8编码,就不需要指定bom头,它可以自己判断,相反指定了bom头,它还会出现问题  
  23.   
  24. (因为它把头当utf-8解析出现乱码了)。这里不截图了,cnblogs里面谈这个比较多,目前ie6会出现问题。其它ie7+,firefox,chrome不会出现,会忽略掉bom头。  
  25.   
  26. 统一解决办法是:存为utf-8编码是,不需要加入bom头,其它utf-16,utf-32加入。  


 

 

知道了这个,解决方案就很明显了:把utf-8的bom头去掉即可。

方式就是文件编码格式选择utf-8无bom。


另摘录一个网上找来的去除bom头的代码:

 

[php] view plain copy

  1. if (isset($_GET['dir'])){//config the basedir  
  2.     $basedir=$_GET['dir'];  
  3. }else{  
  4.     $basedir= '.';  
  5. }  
  6.   
  7. $auto = 1;  
  8.   
  9. checkdir($basedir);  
  10.   
  11. function checkdir($basedir){  
  12.     if($dh = opendir($basedir)) {  
  13.         while(($file = readdir($dh)) !== false) {  
  14.             if($file != '.' && $file!= '..'){  
  15.                 if(!is_dir($basedir."/".$file)) {  
  16.                     echo"filename: $basedir/$file".checkBOM("$basedir/$file")."
    ";  
  17.                 }else{  
  18.                     $dirname= $basedir."/".$file;  
  19.                     checkdir($dirname);  
  20.                 }  
  21.             }  
  22.         }  
  23.     closedir($dh);  
  24.     }  
  25. }  
  26.   
  27. function checkBOM ($filename) {  
  28.     global$auto;  
  29.     $contents= file_get_contents($filename);  
  30.     $charset[1] =substr($contents, 0, 1);  
  31.     $charset[2] =substr($contents, 1, 1);  
  32.     $charset[3] =substr($contents, 2, 1);  
  33.     if(ord($charset[1]) == 239 && ord($charset[2]) == 187 &&ord($charset[3]) == 191) {  
  34.         if($auto == 1) {  
  35.             $rest= substr($contents, 3);  
  36.             rewrite ($filename,$rest);  
  37.             return("BOM found,automatically removed.");  
  38.         }else {  
  39.             return("BOM found.");  
  40.         }  
  41.     }  
  42.     elsereturn ("BOM Not Found.");  
  43. }  
  44.   
  45. function rewrite ($filename,$data) {  
  46.     $filenum= fopen($filename,"w");  
  47.     flock($filenum, LOCK_EX);  
  48.     fwrite($filenum,$data);  
  49.     fclose($filenum);  
  50. }  
  51.   
  52. ?>  


 

 

 

另外一个常见的bom头的地方时xml文件。解析失败的话,有很大一部分原因是这个。

Error on line 1 of document  : Content is not allowed in prolog. Nested exception: Content is not allowed in prolog.

此时只要去掉bom头就行了。

特此记录下来,希望对大家有帮助。

(2011-11-03  happyelements)


转:https://my.oschina.net/u/3572879/blog/1575166



推荐阅读
  • 本文详细介绍了Python open()函数的用法,包括文件操作的流程和具体的打开模式。通过该函数,可以打开文件并进行读取、写入等操作。同时,还介绍了文件路径的两种形式和不同的打开模式。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 本文介绍了在git中如何对指定的commit id打标签,并解决了忘记打标签的问题。通过查找历史提交的commit id,可以在任意时间点打上标签。同时,还介绍了git中的一些常用命令和操作。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 本文讨论了在PHP中将空格转换为问号的问题,并提供了解决方案。文章指出,空格不是标准的空格,而是特殊的0xC2 0xA0字符。作者尝试使用mb_convert_encoding函数将utf8字符串转换为gbk编码,但未成功。文章建议检查编辑器是否对空格进行了特殊处理,并提供了使用base64_encode函数打印结果的方法。最后,给出了完整的代码示例。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 本文总结了解决python文件读写乱码问题的方法。其中包括错误的打开方式和正确的打开方式,并提供了相应的代码示例。建议在进行写入操作后先将文件关闭,然后再打开,最后再读取文件。若文件编码是utf-8,则需要在读取文件时添加decode('utf-8')。这样操作可以避免在打开记事本时出现乱码问题。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • CSS|网格-行-结束属性原文:https://www.gee ... [详细]
  • 对Firefoxios源码的精简Firefox的依赖使用carthage来进行管理,国内的网络是在过于坑爹,相关的依赖包总是无法下载下来,花了两天时间,手动将Firefox所依赖的库导入 ... [详细]
author-avatar
巧干篆书_618
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有