0

0

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

絕刀狂花

絕刀狂花

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

|

469人浏览过

|

来源于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免费学习笔记(深入)”;

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

速创猫AI简历
速创猫AI简历

一键生成高质量简历

下载
  • 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
  • curlfile_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通常可以忽略。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

238

2023.09.22

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

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

519

2024.03.01

curl_exec
curl_exec

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

445

2023.06.14

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

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

178

2023.10.30

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

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

361

2023.08.03

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

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

213

2023.09.04

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

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

1505

2023.10.24

字符串介绍
字符串介绍

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

626

2023.11.24

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

0

2026.02.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号