Unicode規範中有一個BOM的概念。BOM——Byte Order Mark,就是位元組序标記。在這裡找到一段關于BOM的說明:
在UCS 編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字元,它的編碼是FEFF。而FFFE在UCS中是不存在的字元,是以不應該出現在實際傳輸中。UCS規範建議我們在傳輸位元組流前,先傳輸字元"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個位元組流是Big-Endian的;如果收到FFFE,就表明這個位元組流是Little-Endian的。是以字元"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。
UTF-8不需要BOM來表明位元組順序,但可以用BOM來表明編碼方式。字元"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。是以如果接收者收到以EF BB BF開頭的位元組流,就知道這是UTF-8編碼了。
Windows就是使用BOM來标記文本檔案的編碼方式的。
另外unicode網站的FAQ-BOM詳細介紹了BOM。官方的自然權威,不過是英文的,看起來比較費勁。
UTF-8編碼的檔案中,BOM占三個位元組。如果用記事本把一個文本檔案另存為UTF-8編碼方式的話,用UE打開這個檔案,切換到十六進制編輯狀态就可以看到開頭的FFFE了。這是個辨別UTF-8編碼檔案的好辦法,軟體通過BOM來識别這個檔案是否是UTF-8編碼,很多軟體還要求讀入的檔案必須帶BOM。可是,還是有很多軟體不能識别BOM。我在研究Firefox的時候就知道,在Firefox早期的版本裡,擴充是不能有BOM的,不過Firefox 1.5以後的版本已經開始支援BOM了。現在又發現,PHP也不支援BOM。
PHP在設計時就沒有考慮BOM的問題,也就是說他不會忽略UTF-8編碼的檔案開頭BOM的那三個字元。由于必須在<?或者<?php後面的代碼才會作為PHP代碼執行,是以這三個字元将會直接輸出。如果插件的檔案有這個問題,将會導緻在背景頁面裡激活或者不激活插件後顯示白屏,如果是模版檔案有這個問題,将會導緻這三個字元直接輸出,造成頁面上方有一個小空行。國外的英文插件和模版一般都是用的ASCII碼的編碼方式,不會有BOM,隻有國内的插件和模版會由于作者的不知情造成問題。還有,大家修改模版的時候,由于輸出頁面使用UTF-8編碼,那麼修改模版的時候如果有加入中文字元的話,必須把檔案轉成UTF-8編碼才能正常顯示,這個時候如果所使用的編輯器自動加上了BOM的話,将會造成在頁面上輸出這三個字元,顯示效果就要看浏覽器了,一般是一個空行或是一個亂碼。