6 月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(建立資料庫連線時發生錯誤)”

   

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *