最近更新: 2006-02-07

PHP~~關於 PHP 4/5 對 UTF-BOM 的 bug

在 Windows 系統下,有些以 utf-8 編碼儲存的文件,交由 PHP4/5 處理時,會發生非預期的結果。

原因在於 Windows 下的記事本 (notepad) 儲存 utf-8 編碼文件時,會加上 BOM 檔頭,而 PHP 4/5 會把 BOM 視為一般字元輸出,連帶影嚮整個網頁的輸出結果。這個問題,其實早經由使用者反應給 PHP 開發團隊,但令人遺憾的是, PHP 開發團隊的答案是 PHP6 「就會正式支援 unicode 」,到時就不會有 BOM 問題了。

[22 Aug 2005 6:35pm CEST] derick@php.net
This will come with Unicode support in PHP 6.0
Bug #22108 php doesn't ignore the utf-8 BOM

其實要解決這個問題並不困難,目前似乎 Microsoft 的軟體 (如 Notepad) 才會一律在 utf-8 編碼的文件中寫入 BOM 檔頭。其他軟體則都可選擇要不要加入 BOM 。只要改用如 Ultraedit 或 PSPad, NotePad++ 這些支援 utf-8 編碼且不會寫入 BOM 檔頭的編輯器即可。 Unix/Linux 系統下可選擇的就更多了。但不幸的是, Notepad 身為 Windows 預設的文字編輯器,且是少數早期就開始支援 unicode 編碼的編輯器,使用者還真是不少,有不少文件就這麼被 Notepad 加上 BOM 檔頭了。

說了半天,什麼是 BOM ?請看 Unicode 組織的解釋。

Byte Order Mark (BOM) FAQ

Q: What is a BOM?

A: A byte order mark (BOM) consists of the character code U+FEFF at the beginning of a data stream, where it can be used as a signature defining the byte order and encoding form, primarily of unmarked plaintext files. Under some higher level protocols, use of a BOM may be mandatory (or prohibited) in the Unicode data stream defined in that protocol.

FAQ - UTF-8, UTF-16, UTF-32 & BOM

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词

雖然絕大多數情形下, BOM 的存在並不會有什麼影嚮,但其實還是存在誤判的情形。這裡舉一個例子,在 Big5 碼系統下 (如繁體中文Windows) ,開啟一種文字編輯器 (例如 Notepad ) 輸入「嚜蹂」兩字,然後選擇 ANSI 編碼格式存檔後關閉檔案,再重新開啟剛剛儲存的文件,就會發現 Notepad 誤判文件編碼,而無法正確顯示內容。事實上,連 Ultraedit 這套編輯器也會栽在這上頭。 PSPad 倒是少數不會被玩倒的編輯器。這是因為「嚜」的 Big5 編碼是 EF BB ,「蹂」的 Big5 編碼是 BF E4 ,儲存後是 EF BB BF E4 ,前 3 個位元組剛好就是 BOM ,以致許多支援 utf-8 的軟體誤判文件編碼。

由於存在上述的誤判可能性,我個人並不建議在 utf-8 文件中加上 BOM 檔頭。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/1096340.html

樂多舊回應
hkong1hung(kong) (#comment-3546395)
Thu, 09 Nov 2006 20:38:26 +0800
thx a lot
ascii.ss@msa.hinet.ent(Ascii) (#comment-11239883)
Tue, 10 Jul 2007 23:38:27 +0800
小的僅是一位查資料路過的人…
近期正為此事煩心…程式總是會跑出個"嚜?"…
感謝版主分享此資訊…
最近有空來試試…應該能解決小的困擾…
感恩感恩…
未留名 (#comment-15918369)
Thu, 06 Mar 2008 16:39:08 +0800
感謝,在ROR也是會有一樣的情況出現。
dorlfish@yahoo.com.tw(dorl) (#comment-22444900)
Thu, 10 May 2012 15:42:58 +0800
感謝大大的解說,今天也剛好遇到這個問題,看到您詳細的解說才懂得,非常感恩!