六月30
UTF-8的BOM檔頭格式造成WordPress的PHP執行錯誤

UTF-8的BOM檔頭格式造成WordPress的PHP執行錯誤

像對工作熊這種業餘的三腳貓來說,改個PHP程式語法還要管什麼UTF-8檔案儲存格式要不要去除BOM檔頭,真的非常麻煩,而且這還不是第一次出這種錯了。

以工作熊這次部落格從「B家虛擬主機」搬家到「S家虛擬主機」後,什麼都沒有動,但就是出現【Warning: Cannot modify header information – headers already sent by (output started at …/wp-config.php:1)】這樣的錯誤,怎麼每次虛擬主機搬家都會碰上一些問題,還有都可以解決!

當天因為弄到很晚,所以半夜開了一張Ticket單給虛擬主機的技術客服後就跑去睡了,隔天一早起來發現已經修好了,原來就是這個BOM檔頭格式在作怪,只要把這個BOM檔頭去掉就問題就解決了。老實說這B家的技術客服度目前為止速度都還蠻快的,也都可以解決工作熊的問題。

那什麼是BOM檔頭?

在 UTF-8的編碼檔中,BOM放置在檔頭最前面的地方,佔用了三個位元組,用來標示該檔案屬於UTF-8編碼。其實現在已經有很多軟體都可以識別BOM檔頭,但還是有些不能識別BOM檔頭者,比如PHP就不能識別BOM檔頭, 這也是為何使用Windows內建的記事本(notepad)編輯UTF-8的文件編碼後執行程式會出錯的原因。 其實UTF-8 的BOM對UFT-8並沒有作用,其設置是為了支援UTF-16、UTF-32 才加上BOM檔頭的,BOM簽名的意思就是告訴編輯器當前檔採用何種編碼,以方便文件編輯器識別,雖然 BOM在編輯器中不會被顯示出來,但實際上還是存在,而且會產生輸出 , 就像多了一個空行。

一般如果我們使用Windows內建的記事本(notepad)應用程式來編輯並儲存成UTF-8檔案格式時,就會在檔案開始的地方插入三個不可見的字元( 0xEF 0xBB 0xBF)的BOM擋頭。

一般如果我們使用Windows內建的記事本(notepad)應用程式來編輯並儲存成UTF-8檔案格式時,就會在檔案開始的地方插入三個不可見的字元( 0xEF 0xBB 0xBF)的BOM擋頭。對於一般的文書軟體來說,這樣的BOM檔頭並不會產生什麼麻煩。但對於PHP來說,BOM檔頭卻是個噩夢。因為PHP並不會忽略BOM檔頭字元,所以PHP在讀取、包含或者引用這些檔案時,都會把BOM檔頭作為該檔開頭程式的一部分。根據嵌入式語言的特點,這串字元也會被直接執行或顯示出來。

BOM檔頭其實不僅僅會影響到PHP程式的執行而已,它也會影響到html格式的檔案,例如有BOM檔頭的html檔案,即使頁面的top padding已經設置為0,也無法讓整個網頁緊貼著瀏覽器頂部,因為在html一開頭有這3個字元!另外一個大麻煩,受到COOKIE送出機制的限制,在這些已經有BOM檔頭的檔案中,COOKIE是無法送出的,因為在COOKIE送出前PHP已經送出了檔頭,所以登入和登出功能失效。一切依賴COOKIE、 SESSION實現的功能全部無效。因此強烈建議,在編輯、更改任何文字檔時,請務必使用不會亂加BOM的編輯器。

如何去除文件檔或PHP檔案的BOM擋頭

一般Linux下的編輯器應該都沒有這個問題。如果是Windows下的環境,建議請勿使用期內建的記事本編輯器。推薦的編輯器有Editplus 2.12以後的版本、Notepad++、EmEditor、UltraEdit(需要取消「添加BOM」的相關選項)、Dreamweaver(需要取消「添加BOM」的相關選項)等。

對於已經添加了BOM檔頭的檔案格式,要取消的話,可以使用以上編輯器開啟後另存新檔(save as)。儲存時在編碼(Encoding)的地方選擇UTF-8就可以了(Editplus的儲存格式可以選擇【UTF-8】與【UTF-8 + BOM】和其他格式。)


延伸閱讀:
WordPress的RSS讀取錯誤問題解決
網站遭駭客入侵、與虛擬主機商技術客服打交道的經驗分享
[已解決]WordPress登入顯示空白問題-更改wp-config.php
如何解決WordPress “Error establishing a database connection(建立資料庫連線時發生錯誤)”


本部落格提供免費電子書索取:
我如何開始寫部落格 寫部落格賺錢術 如何提昇部落格人氣

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *