PHP批量检测与清除UTF-8 BOM头工具及编辑器设置方法
PHP对UTF-8文件中的BOM(Byte Order Mark)标识符不支持,这通常导致Cookie发送失败、Session初始化错误或JSON解析异常。通过运行特定的PHP脚本,可以自动遍历指定目录,检测并静默剔除这些多余的三个字节,无需手动修改每个文件。
为什么PHP需要去BOM
BOM是“字节顺序标记”,在UTF-8文件中表现为文件头部的三个不可见字节(EF BB BF)。虽然许多现代文本编辑器能识别它,但PHP解释器将其视为普通输出内容。当文件包含BOM时,任何试图在输出前发送Header、Setcookie或Startsession的操作都会报错,因为数据流已经提前发出。这个问题常由使用Windows记事本另存为“UTF-8”格式引起。
批量清除BOM的PHP脚本
以下代码提供了一个完整的解决方案:首先递归检查指定目录下的所有非隐藏文件,判断是否包含BOM;若检测到存在,则自动读取剩余内容并重写文件,从而去除BOM。此脚本可通过浏览器访问执行,适合部署在临时测试环境中清理项目文件。
<?php
// 接收目标目录参数,默认为当前目录
if (isset($_GET['dir'])) {
$basedir = $_GET['dir'];
} else {
$basedir = '.';
}
// 自动移除模式,设置为0仅检测不修改
$auto = 1;
checkdir($basedir);
function checkdir($basedir) {
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
// 跳过当前目录和父目录引用
if ($file != '.' && $file != '..') {
// 如果是文件,则进行BOM检测和清除
if (!is_dir($basedir."/".$file)) {
echo "filename: $basedir/$file " . checkBOM("$basedir/$file") . "<br>";
} else {
// 递归进入子目录
$dirname = $basedir."/".$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
// 获取文件前三字节
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
// UTF-8 BOM的ord值分别为239, 187, 191
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
// 保留从第4个字符开始的内容,重写文件
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return "<font color=red>BOM found, automatically removed.</font>";
} else {
return "<font color=red>BOM found.</font>";
}
} else {
return "BOM Not Found.";
}
}
function rewrite ($filename, $data) {
// 以独占写入模式打开文件,防止并发写入冲突
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
注意事项
- 备份建议:在执行批量操作前,务必对项目代码进行完整备份,以防误删关键内容或意外覆盖。
- 适用范围:该脚本主要针对.php、.html、.json等纯文本文件。图片、压缩包或二进制文件不应混入扫描目录。
- 访问方式:将上述代码保存为
remove_bom.php并放置于待处理项目的根目录,通过浏览器访问http://your-domain/remove_bom.php?dir=./即可开始清理。
常用编辑器的BOM预防设置
除了使用脚本批量修复,更推荐从源头解决问题,即配置代码编辑器在保存时默认不包含BOM头。
EditPlus 设置方法
- 启动EditPlus,点击顶部菜单
工具→首选项。 - 在左侧列表中选择
文件(Files)。 - 找到
UTF-8标识选项,将其修改为总是删除签名。 - 点击确定保存后,后续保存的所有UTF-8文件将不再附带BOM。
UltraEdit 设置方法
- 打开任意一个配置文件。
- 在
另存为对话框中,查看底部的编码选择框。 - 选择
UTF-8 (无BOM)而非默认的UTF-8。 - 建议在软件的全局配置中永久固定此编码选项,确保一致性。
其他排查方向
如果页面仍然出现乱码,请确认HTML头部是否正确声明了字符集:<meta charset="UTF-8"> 或通过PHP header("Content-type: text/html; charset=utf-8"); 进行控制。此外,若输出图像(如GD库生成的PNG/JPEG),务必确保PHP代码在调用 imagepng() 或 imagejpeg() 之前没有任何非空的字符串输出(包括空格、换行或日志信息),否则会导致图像损坏或显示红叉。
以上就是PHP批量去除BOM头及相关编码处理的详细内容,更多关于PHP开发技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













