天天看點

UTF8與UTF8 without BOM之間的問題

UTF-8 編碼的檔案可以分為no BOM 和 BOM兩種格式。

何謂BOM? "EF BB BF" 這三個位元組就叫BOM,BOM的全稱叫做"Byte Order Mard".在utf-8檔案中常用BOM來表明這個檔案是UTF-8檔案,而BOM的本意實在utf16中用來表示高低位元組序列的。在位元組流之前有BOM表示采用低位元組序列(低位元組在前面),而utf8不用考慮位元組序列,是以其實有無BOM都可以。UTF-8以位元組為編碼單元,沒有位元組序的問題。UTF-16以兩個位元組為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的位元組序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16位元組流“594E”,那麼這是 “奎”還是“乙”?

如果檔案儲存時,選擇了使用 BOM,那麼就可能會出現 headers already sent 的問題。

因為 Web 伺服器軟體可能不認識 BOM,是以就把 BOM 的兩個特殊位元組當做字元發送給浏覽器了。

這時再調用 session_start() 等函數,就會出現 headers already sent 的問題。

是以解決此問題最根本的方法就是在儲存 UTF8 編碼檔案時,不要使用 BOM。

微軟的記事本 Word 等隻能正确打開含BOM的UTF8檔案,然後UltraEdit卻恰恰相反,回把BOMutf8檔案 誤認為ascii編碼。

UTF-8的BOM是 EFBBBF,因為UE載入UTF-8檔案會轉成Utf16,上述的EFBBBF 在Utf16中是FFFE(Unicode-LE的BOM),UltraEdit不認識BOM又加多一個BOM,是以有2個FFFE。檔案就被它破壞了。

當應用程式的檔案使用 UTF8 編碼時,在儲存檔案時,一定要注意 BOM 的問題。

繼續閱讀