讲师中心 微信公众号
AI工具推荐 视频效率加速

PHP如何判断文件是否含BOM头_PHP识别BOM头法【编码】

陌瑶姑娘_7674

陌瑶姑娘_7674

发布时间:2026-02-03 13:54:31

|

650人浏览过

|

来源于php中文网

原创

PHP应使用fopen('rb') + fread(4) + bin2hex()读取文件前4字节并比对十六进制值判断BOM,而非mb_detect_encoding或file_get_contents;常见BOM为'efbbbf'(UTF-8)、'fffe'(UTF-16 LE)等。

php如何判断文件是否含bom头_php识别bom头法【编码】

PHP如何读取文件前3字节判断BOM

直接读取文件开头几个字节,比用 mb_detect_encoding 可靠得多——后者根本不识别BOM,且对UTF-8无BOM和GBK混杂的情况极易误判。

关键不是“检测编码”,而是“确认有没有BOM”。BOM是硬编码在文件头的字节序列,只需比对:

  • EF BB BF → UTF-8 BOM
  • FF FE → UTF-16 LE BOM(小端)
  • FE FF → UTF-16 BE BOM(大端)
  • FF FE 00 00 → UTF-32 LE
  • 00 00 FE FF → UTF-32 BE

实操建议:用 fopen + fread 读前4字节(覆盖所有常见BOM长度),再用 bin2hex 转成小写十六进制字符串比对。避免用 file_get_contents 全量读取大文件,也别依赖 mb_check_encoding——它不看BOM。

为什么 file_get_contents($f, false, null, 0, 3) 不够用

这个写法看似省事,但有两处隐患:file_get_contents 默认按当前脚本编码解析内容,若文件含BOM而PHP内部处理时做了隐式转换(比如开启 default_charset 或用了输出缓冲),前三字节可能被截断或变形;更严重的是,它无法区分 \xEF\xBB\xBF 和普通中文字符的UTF-8三字节序列(如“一”是 \xE4\xB8\x80),纯靠长度不够。

立即学习“PHP免费学习笔记(深入)”;

Handsfree Windows Control
Handsfree Windows Control

通过 handsfree-windows CLI控制 Windows 本机应用 (UIA) 和浏览器 (Playwright) 的引导技能,用于自动化或测试桌面应用。

下载

必须绕过字符层,走二进制流:

  • 用 fopen($f, 'rb') 强制二进制模式
  • 用 fread($fp, 4) 读4字节(UTF-32 BOM需4字节)
  • 用 unpack('H*', $bytes) 或 bin2hex($bytes) 获取原始十六进制
  • 注意:strlen($bytes) 必须 ≥ 3 才能判断UTF-8 BOM,空文件或只读到1–2字节时不能贸然断言“无BOM”

实际处理时容易漏掉的边界情况

BOM不一定在文件最开头——如果文件被追加写入、或用某些编辑器“保存为带BOM”时中间插入了不可见字符,^\xEF\xBB\xBF 正则会失效。所以严格来说,BOM只应出现在文件起始位置,其他位置的相同字节不算。

还有几个易错点:

  • Windows记事本另存为UTF-8时,一定带BOM;VS Code默认不带,但用户可手动开启——不能假设编辑器行为一致
  • PHP CLI下读取文件,$_SERVER['SCRIPT_FILENAME'] 指向的文件本身若有BOM,会导致“Cannot modify header information”错误,但错误提示里完全不提BOM
  • 用 curl 或 file_get_contents 请求远程URL返回的内容,即使响应头声明 Content-Type: text/html; charset=utf-8,也不能反推它是否含BOM——BOM是文件/响应体字节层面的事,和HTTP头无关

封装一个可靠的 is_file_has_bom 函数

不要每次重复写 fopen/fread/bin2hex,封装成函数更稳妥。注意它只负责判断,不负责去除:

function is_file_has_bom(string $path): bool
{
    if (!is_readable($path)) {
        return false;
    }
    $fp = fopen($path, 'rb');
    if (!$fp) {
        return false;
    }
    $bytes = fread($fp, 4);
    fclose($fp);
    $hex = bin2hex($bytes);
    return in_array($hex, [
        'efbbbf',    // UTF-8
        'fffe',      // UTF-16 LE
        'feff',      // UTF-16 BE
        'fffe0000',  // UTF-32 LE
        '0000feff',  // UTF-32 BE
    ], true);
}

这个函数不依赖扩展,不触发任何编码转换,也不加载整个文件。真正麻烦的是后续动作:发现BOM后,你是跳过它解析、还是用 file_put_contents 去除、还是报错中断?这些决策得结合业务场景来定——比如配置文件含BOM可能导致 parse_ini_file 解析失败,但日志文件里的BOM通常可以忽略。

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

3723

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

855

2023.10.30

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1798

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2824

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6164

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5929

2023.11.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn