什么是BOM头

类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于PHP来说,BOM是个大麻烦。

  PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

=================================================================================================

window编辑器如果保存为utf8文件就会帮你加上BOM头,以告诉其他编辑器以utf8来显示字符

但是在网页上并不需要添加BOM头识别,因为网页上可以使用 head头指定charset=utf8告诉浏览器用utf8来解释.但是你用window自动的编辑器,编辑,然后有显示在网页上这样就会显示出0xEF0xBB 0xBF这3个字符。

这样网页上就需要去除0xEF 0xBB 0xBF,可以使用editplus 选择不带BOM的编码,这样就可以去除了

### BOM 的概念 BOM 是 **Byte Order Mark** 的缩写,中文译为字节序标记。它是一种用于标识文本文件或流中使用的字符编码方式的特殊标记[^1]。最初的设计目的是为了处理不同计算机体系结构中的字节顺序问题(即大端模式 Big Endian 和小端模式 Little Endian),尤其是在涉及多字节编码(如 UTF-16 或 UTF-32)的情况下。 #### 不同编码下的 BOM 表现 在 Unicode 编码方案中,BOM 被用来区分不同的字节序以及具体的编码形式。以下是几种常见编码对应的 BOM 值: - **UTF-8**: 虽然 UTF-8 并不严格需要 BOM,但在某些情况下仍可能附加一个特定的序列 `EF BB BF` 来表明其为 UTF-8 编码[^2]。 - **UTF-16LE (Little Endian)**: 使用 `FF FE` 作为标志位来指示这是采用小端存储方式的 UTF-16 数据。 - **UTF-16BE (Big Endian)**: 利用 `FE FF` 显示数据是以大端方式进行排列的 UTF-16 格式。 值得注意的是,对于单字节编码标准(例如 ASCII 或 ISO-8859-1),不存在所谓的 BOM;而对于 UTF-8,尽管可以存在 BOM 序列,但它并非必需部分,并且有时会引起兼容性问题[^3]。 #### BOM 对程序的影响 以 PHP 为例说明 BOM 可能带来的负面影响。当 PHP 解析器遇到含有 BOM 的脚本时,可能会将其视为正常输出的一部分而非元信息而忽略掉。这种行为可能导致意外的结果,比如页面顶端出现空白行或者乱码现象。更严重地讲,如果应用程序依赖于 Cookies 或 Sessions,则因 HTTP 协议规定响应部必须先发送出去才能接着传输主体内容的缘故,任何提前产生的输出都会破坏正常的 Cookie/Session 设定流程,进而影响到登录状态维持等功能模块的工作效率甚至完全失效。 ```php <?php // 如果此文件包含 BOM,下面的内容会被错误解析并导致异常情况发生 echo "Hello, world!"; ?> ``` ### 总结 综上所述,虽然 BOM 在理论上有助于识别文档所使用的具体编码类型及其内部字节次序安排状况,然而实际应用过程中却也可能引发诸多麻烦尤其是跨平台操作场景下更为明显。因此,在现代开发实践中建议尽可能避免不必要的 BOM 插入动作除非确实必要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值