目前遇到有部分函數在UTF8中會因為被插入的BOM出現問題,以下是相關的說明:
如果在 Smarty 中 include 了 UTF-8 格式的檔案,就要小心 BOM (Byte Order Mark) 的問題。
BOM 的由來簡單來說是為了讓一些編輯程式能夠辨認該檔案是不是屬於 Unicode 格式,請參考 憤怒的青蛙: UTF-8, BOM, Micrisoft ,或用 Google 搜尋 UTF-8 BOM ,有更多有用的訊息。
那麼為什麼 BOM 會造成影響呢?因為 BOM 對 HTML 來說是屬於字元,所以 include UTF-8 的檔案時,HTML 就會就會認為被 include 的子樣版上方有個字元,因此就會保留一個空間給它了,就是你們看到那個白白的空行。
補充:這個空白行似乎只有 IE 才會出現。
這種問題也會發生在 PHP 上面,如果有使用 Session 時,常會見到以下情況:

code:Warning: session_start() [http://www.php.net/manual/en/function.session-start]: Cannot send session cookie - headers already sent by (output started at test.php:1) in test.php on line 2

而這也是 BOM 在做怪,原程式如下:

code:(BOM在這裡,但你看不見它)<?php session_start(),?>

解決的方式可以改用 EditPlus 、 EmEdit 等可支援無 BOM 之 UTF-8 的文字編輯器,如果是 Dreamweaver MX 2004 的話,在編碼方式選成 Unicode (UTF-8) 時就要將取消「包含 Unicode 簽名 (BOM) 」。這邊我先提供UltraEdit的儲存畫面就知道要選哪個了。
未命名

也有人說在session_start前面加@也可以避免此問題,但是加了@會導致宣告成功也不給錯誤提示的情況出現。
所以加@並不是真正可以解決問題的方式,根本之道還是在儲存的時候要將BOM的資料消除才行。

我們也可以說這個問題是 php 對 unicode 支援性不足造成的,而 php 的官方說法是預計在 php 6 時才會改成這個問題。
因此,在此之前,請記得在編輯 php 網頁時,不要加註 BOM 的記錄。
arrow
arrow
    全站熱搜

    brucebin 發表在 痞客邦 留言(1) 人氣()