记事本保存PHP文件会插入BOM头:Windows记事本“UTF-8”选项实为UTF-8 with BOM(EF BB BF三字节),PHP将其视为开头输出,导致header()失败、空白行或session异常。

记事本保存 PHP 文件会插入 BOM 头
Windows 记事本在「另存为」时选「UTF-8」,实际保存的是 UTF-8 with BOM——开头三个字节 EF BB BF 会被 PHP 解析器当成输出内容。一旦 <?php 前有这个 BOM,就会触发 Headers already sent 错误,或导致 Parse error: syntax error, unexpected end of file(尤其在 CLI 或 include 场景下)。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 用
hexdump -C yourfile.php | head -n 1检查是否含ef bb bf - VS Code 中右下角点击编码 →
Reopen with Encoding→ 选UTF-8,再点右下角保存图标旁的箭头 →Save with Encoding→ 选UTF-8(确保不勾选 BOM) - 批量清除 BOM:用
sed -i '1s/^\xEF\xBB\xBF//' *.php(Linux/macOS)或 Notepad++ 的「编码 → 转为 UTF-8 无 BOM」
记事本默认用 ANSI(GBK)解析 UTF-8 文件
中文 Windows 下记事本把不含 BOM 的 UTF-8 文件当 GBK 打开,结果中文全变乱码或整片空白——不是文件坏了,是解码方式错了。PHP 文件本身若含中文注释、变量名或字符串,一错就全崩。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 别依赖记事本识别编码;它没有「以编码重新打开」功能
- 用
file -i yourfile.php(Linux/macOS)或iconv -f utf-8 -t utf-8//IGNORE yourfile.php验证真实编码 - 确认是 GBK 编码文件?用
iconv -f gbk -t utf-8 yourfile.php > new.php转换,再检查语法:php -l new.php
记事本混用换行符和不可见字符
记事本强制用 \r\n 换行,粘贴网页/Word 内容时还常带全角空格、零宽空格(U+200B)、软回车等。PHP 对这些极其敏感:<?php 前哪怕一个 \r 或空格,都会让脚本提前输出,破坏 header 发送逻辑。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 修改后立即运行
php -l yourfile.php检查语法合法性 - 用 VS Code 打开 →
Ctrl+Shift+P→ 输入「Toggle Render Whitespace」显示所有空白符 - 避免从外部复制代码;如必须,先粘贴到纯文本环境(如 macOS 的 TextEdit → 纯文本模式)过滤格式
PHP 解析器默认只认 UTF-8,不兼容 GBK 文件
即使你用记事本把 PHP 文件存成 GBK 编码,部署到 Linux 服务器后照样报错——PHP 引擎默认按 UTF-8 解析源码,遇到 GBK 字节流直接中断,报 Parse error 或输出乱码 HTML。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 所有 PHP 文件统一保存为
UTF-8 无 BOM,这是唯一被 PHP 官方文档明确支持的源码编码 - 不要在文件开头加
header('Content-Type: text/html; charset=gbk');来“补救”——这只能影响浏览器渲染,不能修复解析阶段的字节错误 - CI/CD 流程中加入检查:用
grep -rl $'\xEF\xBB\xBF' .扫描 BOM,用find . -name "*.php" -exec file {} \; | grep -v "UTF-8"排查非 UTF-8 文件
xxd 或 od -x 才能揪出来。



















