检查的代码:
<?php
$dir = __DIR__;
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
if ($file->isFile() && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
$content = file_get_contents($file->getPathname());
if (substr($content, 0, 3) === "\xEF\xBB\xBF") {
echo "BOM found in: " . $file->getPathname() . "\n";
} else {
echo "No BOM in: " . $file->getPathname() . "\n";
}
}
}
批量去除Bom头的代码:
<?php
$dir = __DIR__; // 当前目录
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($files as $file) {
if ($file->isFile() && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
echo "Checking: " . $file->getPathname() . "\n"; // 打印正在处理的文件
$content = file_get_contents($file->getPathname());
if (substr($content, 0, 3) === "\xEF\xBB\xBF") {
$content = substr($content, 3);
file_put_contents($file->getPathname(), $content);
echo "Removed BOM from: " . $file->getPathname() . "\n";
}
}
}
但是最后的方法是:
xxd index3.php | head -n 1
发现没有bom头,用PHPStorm右下角的 CR utf-8 改成 CRLF utf-8 就好了。
为什么呢?
CRLF(\r\n):Windows 默认的换行符,两个字符 0x0D 0x0A。
CR(\r):旧版 macOS 使用的换行符,单个 0x0D。
LF(\n):Linux/macOS 默认的换行符,单个 0x0A。
换行格式 | 符号 | ASCII 码 | 操作系统 |
---|---|---|---|
LF(换行 Line Feed) | \n | 0x0A | Linux、macOS(新版本) |
CR(回车 Carriage Return) | \r | 0x0D | 旧版 macOS(Mac OS 9 及更早) |
CRLF(回车+换行) | \r\n | 0x0D 0x0A | Windows |
格式 | 适用系统 | 影响 |
---|---|---|
CRLF UTF-8 | Windows | Windows 兼容,Linux 可能会有 ^M 问题 |
CR UTF-8 | 旧版 macOS | Linux 解析可能出错,现代系统不推荐 |
LF UTF-8 | Linux/macOS | 适用于 PHP / Shell / Linux 服务器 |