`
qiujiayu
  • 浏览: 173662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP的UTF-8 BOM引起的问题

    博客分类:
  • PHP
阅读更多

习惯了用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

分享到:
评论

相关推荐

    批量去掉UTF-8文件中BOM标示符

    然而,UTF-8编码有一种特殊的形式,即带有BOM(Byte Order Mark)的UTF-8,也被称为UTF-8 with BOM。BOM是一个特殊的字符序列,用于标识文件的编码方式,但在某些情况下,BOM可能会引起问题,例如在某些编程语言中...

    php检测文件夹下有含BOM的UTF-8的文件

    然而,UTF-8的BOM并不是必需的,因为UTF-8是无字节顺序的,BOM的存在有时反而会引起问题,比如在某些编辑器中显示乱码或者在处理文件时出现错误。 标题提到的问题是关于如何使用PHP来检测一个文件夹中所有UTF-8格式...

    php utf-8编码去bom小工具

    标题“php utf-8编码去BOM小工具”指的是一个PHP脚本,专门用于去除UTF-8编码的文件开头的BOM(Byte Order Mark)。在UTF-8编码中,BOM是一个可选的字节顺序标记,用于标识文件的字符编码格式。然而,在某些情况下,...

    基于PHP的风吟PHP版BOM移除工具.zip

    7. **编码规范**:良好的编码规范建议在编写PHP代码时避免使用带BOM的UTF-8编码,以减少潜在问题。 总结来说,风吟PHP版BOM移除工具是一款实用的开发辅助工具,能够帮助开发者解决由BOM引发的PHP代码问题,提升代码...

    php查找当前目录下所有带有bom的文件

    标题“php查找当前目录下所有带有bom的文件”指的是使用PHP编程语言编写脚本,以检测指定目录及其子目录中是否存在带有UTF-8 Byte Order Mark(BOM)的文件。BOM是一个特殊的字符编码标记,通常出现在UTF-8编码的...

    PHP 中的 Unicode 签名.doc

    在探讨《PHP中的Unicode签名(BOM)问题》这一主题时,我们首先需要理解几个关键概念:Unicode、UTF-8以及BOM(Byte Order Mark)。Unicode是一种国际标准字符集,旨在支持世界上所有语言的文字,而UTF-8是Unicode的一...

    php清除BOM头

    在PHP编程中,"php清除BOM头"是一个常见的需求,特别是在处理UTF-8编码的文件时。BOM(Byte Order Mark)是一个特殊的字符序列,用于标识文件的字符编码方式。在UTF-8编码中,BOM头由三个字节(0xEF, 0xBB, 0xBF)...

    BOM检测工具 v1.0.0.rar

    总结来说,"BOM检测工具 v1.0.0"是一个专为PHP开发者设计的实用工具,用于检测和可能去除UTF-8文件中的BOM,以确保代码的正常运行和一致性。通过理解和利用这样的工具,可以提高代码质量,减少因编码问题导致的错误...

    bom.rar_BOM

    - 使用PHP代码:通过读取文件,然后以没有BOM的UTF-8格式重新写入,可以实现PHP代码内移除BOM。例如: ```php $content = file_get_contents('file.php'); file_put_contents('file.php', preg_replace('/^[\x{...

    bom.zip_BOM

    在UTF-8编码中,BOM是一个可选的三位字节序列(0xEF, 0xBB, 0xBF),它出现在文本文件的开头,用来指示该文件使用的是UTF-8编码。 描述中提到的“BOM检测工具”是一种实用程序,设计用于检测UTF-8编码的文件是否...

    去除所有页面BOM头

    例如,在PHP中可以使用`mb_convert_encoding($data, 'UTF-8', 'UTF-8-BOM')`来去掉BOM;在Node.js中,可以使用`iconv-lite`库进行转换。 3. 客户端处理:在前端,如果Ajax返回的数据受到BOM影响,可以在接收到数据...

    基于PHP的BOM移除工具.zip

    "基于PHP的BOM移除工具"是指用于处理UTF-8编码文件中Byte Order Mark (BOM) 的工具。BOM是一个特殊的Unicode字符序列,通常出现在UTF-8编码的文件开头,用来标识文件的编码方式。然而,在某些情况下,BOM的存在可能...

    PHP遍历文件夹与文件类及处理类用法实例__2.docx

    `check_utf8bom` 方法用来检测文件是否存在 UTF-8 BOM。它读取文件的前三个字节,与 BOM 的字节序列 `0xEF 0xBB 0xBF` 进行比较。如果匹配,则返回 `true`,否则返回 `false`。 `clear_utf8bom` 方法则负责清除文件...

    基于PHP的风吟PHP版BOM移除工具源码.zip

    风吟PHP版BOM移除工具是一款专门针对PHP源代码中的UTF-8 BOM头进行处理的工具。在深入理解这个工具之前,我们首先要明白什么是BOM(Byte Order Mark)。 BOM,全称为字节顺序标记,是UTF-8编码格式的一个特殊字符...

    [其他类别]PHP除bom小程序_bom.zip

    当PHP文件以UTF-8编码且包含BOM时,虽然大多数现代浏览器可以正确解析,但在某些情况下(如命令行执行、与其他不支持BOM的程序交互等),BOM的存在可能会引起问题。 首先,我们需要了解BOM的工作原理。BOM在UTF-8...

    JoshChen_web格式编码UTF8-无BOM的小细节分析

    BOM是Unicode编码中用于标识文件字节顺序的一个标记,它在某些UTF-8编码的文本文件中可能出现。这个标记通常包括三个字节EF BB BF,它们位于文件的开头。在使用某些文本编辑器创建或保存文件时,可能会自动生成BOM。...

    什么是BOM头,如何去掉BOM头.zip

    在UTF-8编码中,BOM头由三个字节组成(0xEF, 0xBB, 0xBF),它并不是必须的,但有时候会被添加到文件的开头来表明该文件是采用UTF-8编码。尽管BOM头对于某些程序来说是有用的,但它可能会引起一些问题,尤其是在处理...

    BOM清除小工具.rar_BOM

    在IT行业中,BOM(Byte Order Mark)是一个重要的概念,特别是在处理UTF-8编码的文本文件时。BOM是Unicode编码标准中用于标识文件字符集和字节顺序的一个特殊字符。在某些情况下,BOM的存在可能会导致程序读取或解析...

Global site tag (gtag.js) - Google Analytics