UTF-8 的BOM 问题
通常情况下,我都会使用Windows 系统 自 带 的 记 事本程序 编 写网 页 程序,但在 编 写或修改 php 博客系统 代 码 后, 进 行 调试时总 是会出 现 如同以下几点 问题 :
-- 不能登入或者不能登出;
-- 页顶 出 现 一条空白;
-- 页顶 出 现错误 警告;
-- 其它不正常的情况。
分析原因:
由于本人习惯 使用 UTF-8 编码 ,在 编 写或修改代 码 后 都保存为 utf-8 编码 格式。 虽 然 现 在几乎所有的文本 编辑软 件都可以 显 示并 编辑 UTF-8 编码 的文件,但是很 遗 憾的是其中很多 软 件的表 现 并不理想。
类 似 WINDOWS 自带 的 记 事本等 软 件,在保存一个以 UTF-8 编码 的文件 时 ,会在文件 开 始的地方插入三个不可 见 的字符( 0xEF 0xBB 0xBF ,即BOM —— Byte Order Mark )。它是一串隐 藏的字符,用于 让记 事本等 编辑 器 识别这 个文件是否以 UTF-8 编码 。 对 于一般的文件, 这样 并不会 产 生什 么 麻 烦 。但 对 于 PHP 来说 , PHP 在设计时 就没有考 虑 BOM 的问题 ,不会忽略 UTF-8 编码 的文件 开头 BOM 的那三个字符,会把BOM 作为该 文件 开头 正文的一部分。由于必 须 在 <? 或者<?php 后面的代码 才会作 为 PHP 代码执 行,所以将会造成在 页 面上 输 出 这 三个字符, 显 示效果 就要看浏览 器了,一般是一个空行或是一个乱 码 。由于在 html 一开头 有 这 3 个字符的存在,即使页 面的 top padding 设 置 为 0 ,也无法让 整个网 页紧贴浏览 器 顶 部。由于受 COOKIE 送出机制的限制,在这 些文件 开头 已 经 有 BOM 的文件中,COOKIE 无法送出(因为 在 COOKIE 送出前PHP 已经 送出了文件 头 ),所以登入和登出功 能失效。一切依赖 COOKIE 、SESSION 实现 的功能全部无效。
解决办 法:
在编辑 、更改任何文本文件 时 , 请务 必使用不会乱加 BOM 的编辑 器。 Linux 下的编辑 器 应该 都没有 这 个 问题 。 WINDOWS 下,请 勿使用 记 事本等 编辑 器。推荐的 编辑 器是:
Editplus 2.12 版本以上;
EmEditor ;
UltraEdit (需要取消‘添加BOM ’ 的相关选项 );
Dreamweaver (需要取消‘添加BOM ’ 的相关选项 )
等。
对 于已 经 添加了 BOM 的文件,要取消的话 ,可以用以上 编辑 器另存一次。( Editplus 需要先另存为 gb ,再另存为 UTF-8 。)或者,用这 个程序( PHP 版本4.3 以上)