网页头部出现空白行或“锘”字是因文件开头存在BOM(EF BB BF),浏览器将其误渲染;Sublime中通过显示空白符识别U+FEFF或EF BB BF,保存为UTF-8(无BOM)即可清除。

为什么网页头部突然多出空白行或乱码“锘”
这不是 CSS 或 HTML 写错了,而是文件开头藏了 BOM(Byte Order Mark)——一个看不见的三字节标记 EF BB BF。浏览器把它当普通字符渲染,就导致页面顶部白屏、验证码不显示、AJAX 返回乱码,甚至 PHP 输出前被它挤出空白,触发 headers already sent 错误。
Sublime 里怎么一眼识别并删掉 BOM
别靠猜,直接看:
- 打开文件后,按
Ctrl+Shift+P输入show_whitespace回车,或菜单View → Show White Space - 如果第一行开头出现
U+FEFF或一串灰色EF BB BF标记,就是 BOM - 右下角编码显示如果是
UTF-8 with BOM,而不是UTF-8,基本坐实
删法很简单:菜单 File → Save with Encoding → UTF-8 ——注意是 **不带 BOM 的 UTF-8**,不是“UTF-8 with BOM”。保存即生效,不用额外操作。
批量清理整个项目里的 BOM 文件
单个文件手动改还行,但 PHP 模板、JS、CSS、JSON 全混着 BOM 就得批量扫:
- 先确保所有文件用 Sublime 打开时右下角显示
UTF-8(不是 with BOM),否则正则可能匹配失败 - 用
Ctrl+Shift+F打开Find in Files面板 -
Where填项目路径,比如./src;勾选Regular Expression和Whole Word(可选) -
Find:填^\uFEFF—— 这是 Unicode 层面对 BOM 的精准匹配,比搜EF BB BF字节更可靠 -
Replace:留空,点Replace All in Files
注意:^\uFEFF 只匹配文件开头的 BOM,不会误伤正文里的零宽字符。如果某文件没被替换,说明它本来就没 BOM,或者编码不是 UTF-8。
PHP 脚本自动检测 + 清理 BOM 的边界情况
有些老旧服务器上没法直接改编辑器,或者要给团队统一工具,可以用 PHP 脚本扫目录:
把下面代码存为 delbom.php,上传到网站根目录运行:
<?php
function checkBOM($filename) {
$contents = file_get_contents($filename);
if (substr($contents, 0, 3) === "\xEF\xBB\xBF") {
return substr($contents, 3);
}
return false;
}
function processDir($dir) {
foreach (scandir($dir) as $file) {
if (in_array($file, ['.', '..'])) continue;
$path = $dir . '/' . $file;
if (is_dir($path)) {
processDir($path);
} else {
$ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));
if (in_array($ext, ['php', 'html', 'js', 'css', 'json', 'txt'])) {
$clean = checkBOM($path);
if ($clean !== false) {
file_put_contents($path, $clean);
echo "BOM removed: $path\n";
}
}
}
}
}
processDir(__DIR__);
?>
重点看这三处:
- 只处理常见文本后缀,避免误删二进制文件(如
.png) - 用
\xEF\xBB\xBF直接比对字节,不依赖mb_函数,兼容 PHP 5.4+ - 没写
unlink或递归删除逻辑,安全性更高
真正容易被忽略的是:BOM 不仅出现在 PHP 文件里,.js 和 .json 一旦带 BOM,ES6 import 或 JSON.parse() 就会静默失败,错误信息里根本不会提 BOM —— 它只会报 “Unexpected token ” 或 “SyntaxError: JSON at position 0”。

















