PHP 隐形字符 65279 (UTF-8 BOM头) 问题详解与自动去除
在 PHP 开发中,有时页面或接口返回值会出现无法解释的空白或导致 JavaScript/Ajax 解析失败,这通常是由于文件保存时包含了 UTF-8 BOM(Byte Order Mark)头。该字符序列对应十进制 239, 187, 191(十六进制 EF BB BF),即题目所述的“65279”相关问题根源。本文旨在阐明 BOM 的产生机制,并提供有效的预防与清理手段。
问题现象与成因分析
当 PHP 输出内容包含不可见的特殊字符,或者通过 Ajax 获取响应时报错、无法匹配字符串时,开发者常需检查文件编码。UTF-8 编码的文件可分为两种格式:
- 无 BOM 格式:标准 UTF-8,无任何前缀字节。
- BOM 格式:在文件头部添加了
EF BB BF三个字节。虽然 UTF-8 本身不需要 BOM 来标识字节序(BOM 主要用于 UTF-16/32),但部分 Windows 编辑器(如记事本)默认会添加它。
为什么需要避免 BOM?
PHP 在执行时会直接将文件的第一个字节输出给客户端。如果文件头部存在 BOM,这三个字节会被当作普通文本输出。对于 HTML/JS/CSS 等敏感格式,这可能导致格式错误;对于 API 接口,JSON 解析器可能因开头多出的非 JSON 字符而报错。
预防方案:编辑器设置
从源头解决 BOM 问题是最佳实践。大多数代码编辑器都支持将 UTF-8 文件保存为“无 BOM”格式:
- UltraEdit:另存为时,明确选择
UTF-8 - 无 BOM选项。 - Windows 记事本:默认保存为带 BOM。建议在“另存为”对话框中查看编码选项(新版 Windows 记事本允许选择
UTF-8 不带签名)。 - EditPlus / VS Code / Sublime Text:通常在编码设置或文件头标签页中,可以选择关闭 BOM 写入,或直接另存为 ANSI/UTF-8 No BOM 格式。
清理方案:使用 PHP 脚本批量去除
如果项目中已存在大量带 BOM 的历史文件,手动修改效率低下。可以创建一个临时 PHP 脚本放置在网站根目录运行,它将递归扫描指定目录下的所有文件,自动检测并移除 BOM 头。
第1步:准备清理脚本
新建一个名为 remove_bom.php 的文件,放入代码逻辑如下。该脚本会检测文件前三个字节是否为 239, 187, 191,若是,则剔除前三字节后重新写入文件。
// remove the utf-8 boms
// by magicbug at gmail dot com
if (isset($_GET['dir'])){ //config the basedir
$basedir=$_GET['dir'];
}else {
$basedir = '.';
}
$auto = 1;
checkdir($basedir);
function checkdir($basedir){
if ($dh = opendir($basedir)) {
while (($file = readdir($dh)) !== false) {
if ($file != '.' && $file != '..'){
if (!is_dir($basedir."/".$file)) {
echo "filename
$basedir/$file " . checkBOM("$basedir/$file") . "
";
}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);
// 检查 BOM 字节序标记
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return ("BOM found, automatically removed.");
} else {
return ("BOM found.");
}
}
else return ("BOM Not Found.");
}
function rewrite ($filename, $data) {
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
第2步:执行脚本
在浏览器中访问该脚本:http://yourdomain.com/remove_bom.php?dir=/path/to/your/php/files。若留空参数,则默认处理当前目录。
重要提示: 由于该脚本会修改源文件内容,请务必在执行前先备份整个项目目录。脚本输出会显示哪些文件找到了 BOM 并被自动移除。
总结
UTF-8 BOM 头是 PHP 输出异常的一个隐蔽来源。最佳实践是在编辑器中统一配置为“UTF-8 无 BOM”保存。对于存量工程,可利用上述 PHP 脚本进行一次性批量清洗。以上就是 PHP 中解决隐形字符 65279 (UTF-8 BOM头) 问题的详细内容,更多关于 PHP 编码优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













