Archive

文章標籤 ‘BOM’

PHP UTF-8 文件因BOM而發生問題的相關解法

2010年5月4日 3 則評論

最近在PHP4,PHP5上發現有些程式不相容的問題,在PHP4程式可以運行的程式,到了PHP5環境反而出現了

Cannot modify header information – headers already send by…..的錯誤訊息

以前遇到這種問題,就是在使用Header之前已經有output到瀏覽器,在找問題時,一般是include file或在<?PHP ?>前後有空白字元

但PHP4可以執行正常,怎麼到了PHP5會出問題呢?

去追查了一下,發現這似乎是UTF8檔案格式的問題,現行UTF-8格式的檔案,在檔頭會有一個BOM(Binary Order Mark)的字元,印象中在以前的經驗上,往往在處理UTF-8格式的XML,有時也會被這個BOM弄煩了

看來這次也是一樣,因為目前PHP似乎在針對UTF-8的php程式碼,沒有把這BOM碼處理的很好,導致如果有使用Header() 或是include file 時就會發生一些問題

小弟在此整理出一些解法:

1.如果你可以動到php的參數設定檔,那就簡單多了,請在php.ini之中調整output_buffering參數,這參數預設是沒有啟用的,要將此參數打開,就是把 分號(;)拿掉即可,如下:

output_buffering = 4096

這個參數是開了個buffer給output時用的,看php.ini上的註解提到這個是要讓程式允許可以在傳送header及cookies時可暫存的buffer,當使用時就不會直接傳到Client啦;不過這會有一些些影響整個PHP的執行效能,但影響不大啦,這算是最快可以排除的方式,所以列在第一點給大家參考!!

2.如果你有使用UltraEdit(至少是版本14以上才有這功能),可以於存檔時選擇檔案格式UTF-8並且無BOM版本的檔案,這樣就可以避掉BOM會帶來的問題了 (沒有BOM也不會造成UTF-8檔案格式的判斷錯誤)

或是可以下載NotePad++,這套 free的文字編輯器,可到此連結下載http://notepad-plus.sourceforge.net/tw/site.htm 台灣人寫的哦~要愛用國貨外!!
在開啟檔案時,上方選單編碼選項中的「轉換至UTF-8碼(檔首無BOM碼)即可(原文章相關錯誤已修正,感謝那位叫白目捷的友人提供指證),如下圖:

NotePad++ 轉換至UTF-8 無BOM

不過目前要一個一個檔案去做,小弟找了一下,似乎沒有找到可以批次去除BOM的,所以暫時加減用囉~!! 如果有大大知道有程式可以做到,請再告知小弟! 感恩喔!!

補充:後來小弟有找到一套叫Uni2ME,他可以進行批次轉換,下載網址http://www.softking.com.tw/soft/clickcount.asp?fid3=22623
要注意的是,他預設的參數設定是有含BOM碼,要手動調整才行
有需要的人請自行下載使用  

上述就是小弟整理的解法,不過要注意在不同的PHP版本上執行時,還要注意例如session_start()這個函式一定要在最前面執行,不然也有可能會於PHP5上顯示錯誤訊息

參考資料:
http://bbs.ecstart.com/thread-30347-1-4.html

Categories: PHP Tags: ,