網站程式輸出多出怪符號?去掉 BOM 頭就能解決

你是否曾經遇過這樣的情況?明明程式碼一切正常,卻在執行 PHP 網頁時跳出「Headers already sent」錯誤,或是頁面輸出開頭總是多了幾個看不見的怪符號?更麻煩的是,這些問題常常在本機測試時不會出現,一放到正式伺服器就立刻爆錯。其實,罪魁禍首很可能就是「BOM 頭」這個隱藏字符。

什麼是 BOM?

📌 關於 BOM(Byte Order Mark)

BOM 的全名是 Byte Order Mark,在 UTF-8 編碼中,它是一串位於檔案最前端的隱藏字符, 由三個位元組組成:EF BB BF

它的原始用途是在 UTF-16 或 UTF-32 等編碼裡,用來標示檔案的位元順序。 但在 UTF-8 環境下,這段 BOM 並不是必要的

問題就出在這裡:如果一個檔案被儲存成「UTF-8 with BOM」,那麼這三個隱藏字節也會一併輸出。一般純文字或記事本類應用會忽略它,但 PHP、JSON 或 API 回應則會把它當成實際輸出的內容,導致程式判斷錯誤或資料格式無法解析。

隱藏字符造成的實際影響

如果檔案帶有 BOM 頭,最常見的狀況就是在 PHP 環境下直接報錯。
比方說,瀏覽器可能會跳出:

Warning: Cannot modify header information - headers already sent

這表示在程式還沒來得及送出 HTTP 標頭時,BOM 已經偷偷被輸出,破壞了正常的流程。

另一個常見案例是 JSON 輸出失敗。如果 API 回應的最前端夾帶了 BOM,前端程式或第三方系統就會解析不出正確的 JSON,導致「明明資料正確卻一直報錯」。

常見編輯器的解決辦法(實務教學)

既然知道了 BOM 會帶來麻煩,最根本的解法就是 把檔案存成「UTF-8 無 BOM」格式。不同的編輯器操作方式略有差異,以下整理幾個常見方法:

🔧 常見編輯器去除 BOM 方法

EditPlus 開啟 EditPlus → 工具 → 首選項 → 文件 → UTF-8 標識 → 勾選「總是刪除簽名」。
之後再編輯與儲存 PHP 檔案時,就不會再產生 BOM。
UltraEdit 開啟檔案後,使用「另存為」功能,在編碼選項中選擇 UTF-8 無 BOM,即可存出乾淨的檔案。
Dreamweaver 進入「修改 → 頁面屬性 → 標題/編碼」,找到「包括 Unicode 簽名 (BOM)」選項,
把前面的勾取消掉即可。
VS Code 打開檔案時,如果右下角顯示 UTF-8 with BOM,代表檔案帶有 BOM。
點擊該按鈕 → 選擇「UTF-8」後重新儲存,就能移除 BOM。

這些方法都能在日常開發中快速解決問題,建議團隊統一設定,避免同事間因為編輯器不同而產生 BOM 錯誤。

我的小建議

從專業角度來看,BOM 雖然只是幾個隱藏字節,卻常常成為專案中最棘手的「小石頭」。因此,我的建議是:

✅ BOM 問題預防重點

  • 團隊統一規範:在專案初期就訂好「所有檔案一律使用 UTF-8 無 BOM」,並寫進文件規範。
  • 善用編輯器設定:不論是 VS Code、EditPlus 或其他 IDE,都能預先設定預設編碼,省下日後除錯時間。
  • 問題排查思路:當遇到莫名其妙的「header already sent」或 JSON 無法解析時,第一時間就要想到可能是 BOM 作怪。

最後提醒一句:程式輸出的「怪符號」往往不是你寫錯,而是檔案編碼藏了陷阱。只要把 BOM 移除,就能讓網站或 API 回到正常運作。

👉 你曾經遇過 BOM 害你 debug 半天的經驗嗎?

歡迎留言分享,或者如果你的網站因此出現奇怪錯誤,
也可以找我們聊聊。

聯絡我們,解決 BOM 問題
返回頂端