PHP中utf-8編碼格式之BOM引發的問題

    一個很常見的錯誤:在使用setcookie() 時經常會遇到的,就是cannot modify header information - headers already sent by.... 錯誤,可是確實沒有在setcookie前輸出任何內容,如果你使用的是UTF-8編碼,那麼這個錯誤的原因多半就是因爲編碼了,因爲PHP4,5都不能識別UTF-8編碼中的BOM,所以你一定要把文件保存成無BOM格式(可以使用notepad++等工具轉換一下)。

   那麼BOM到底是何方神聖呢?要他有什麼用? 

      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

     U TF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。
    問題是,BOM雖然在編輯器中不顯示,但是會產生輸出,這就是
headers already sent by.... 產生的原因了。
  可是不用BOM又有一些問題,因爲某些比較老的瀏覽器(如IE6)如果沒有BOM他又識別不了,會產生明明有內容頁面卻一片空白的問題,我的解決辦法是將setcookie() 等需要在輸出前調用的函數及調用這個函數之前的所有代碼放在一個外部文件中,保存爲無BOM格式,而網頁的主體保存爲正常格式,並在第一行引用這個外部文件,這樣就解決了這個問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章