首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 隱形字元 65279 (UTF-8 BOM) 問題完整解析與移除方案

     編輯:PHP 綜合知識

什麼是 BOM?

  • BOM (Byte Order Mark):EF BB BF 三個位元組,標記檔案為 UTF-8 編碼。
  • 原本用於 UTF-16 指示位元組序,UTF-8 並不需要,但許多編輯器仍會加上。
  • PHP 執行輸出時會將 BOM 直接送到瀏覽器,導致:
  1. 頁面頂端出現空白行
  2. header()、session_start() 失效 (已輸出內容)
  3. AJAX 回傳資料前綴多出 3 個位元組,導致字串比對失敗

常見編輯器 BOM 行為差異

編輯器預設儲存行為
UltraEdit提供「UTF-8」與「UTF-8 - 無 BOM」兩種選項
Windows 記事本預設儲存含 BOM
EditPlus 2.31無 BOM
EditPlus 2.11含 BOM
VS Code / Sublime / PhpStorm預設無 BOM (右下角可切換)

解決方案一:編輯器另存為「無 BOM」

UltraEdit:另存新檔 → 編碼選 UTF-8 - 無 BOM

VS Code:右下角點擊「UTF-8 with BOM」切換為「UTF-8」

解決方案二:PHP 批次移除專案內所有 BOM

將以下程式碼存為 remove_bom.php 放在專案根目錄執行:

isFile()) continue;
    $path = $file->getPathname();
    $content = file_get_contents($path);
    if (strlen($content) >= 3 && ord($content[0]) === 0xEF && ord($content[1]) === 0xBB && ord($content[2]) === 0xBF) {
        if ($autoRemove) {
            file_put_contents($path, substr($content, 3));
            echo "[移除] $path\n";
        } else {
            echo "[發現 BOM] $path\n";
        }
    }
}
echo "完成。\n";

解決方案三:輸出緩衝區攔截 (治標不治本)

ob_start(function ($buffer) {
    return preg_replace('/^\xEF\xBB\xBF/', '', $buffer);
});

放在入口檔案最開頭,可移除輸出中的 BOM,但無法解決 header() 已送出的問題。

最佳實務

  • 專案規範:所有 PHP 檔案必須使用無 BOM 的 UTF-8。
  • Git 攔截:在 .gitattributes 加入 * text=auto eol=lf,並在 pre-commit hook 檢查 BOM。
  • 部署腳本:上線前自動掃描移除 BOM。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved