UTF-8簽名(UTF-8 signature)也叫做BOM(Byte order Mark),是UTF編碼方案里用於標識編碼的標准標記。如果多個文件設置了簽名,在二進制流中就會包含多個UTF-8簽名,而IE是無法識別多個UTF-8簽名的,所以用一個空行來代替,在某些程序處理中還會出現一個類似“諾"的字符。
BOM(Byte Order Mark),是UTF編碼方案里用於標識編碼的標准標記,在UTF-16里本來是FF FE,變成UTF-8就成了EF BB BF(239 187 191)。這個標記是可選的,因為UTF-8字節沒有順序,所以它可以被用來檢測一個字節流是否是UTF-8編碼的。微軟做這種檢測,但有些軟件不做這種檢測,而把它當作正常字符處理。
微軟在自己的UTF-8格式的文本文件之前加上了EF BB BF三個字節, windows上面的notepad等程序就是根據這三個字節來確定一個文本文件是ASCII的還是UTF-8的, 然而這個只是微軟暗自作的標記, 其它平台上並沒有對UTF-8文本文件做個這樣的標記。
區分UTF-8文件是否含有BOM方法:
1,用UltraEdit-32打開文件,切換到十六進制編輯模式,察看文件頭部是否有EF BB BF;
2,用Dreamweaver打開,察看頁面屬性,看“包括Unicode簽名BOM"前面是否有個勾;
3,用Windows的記事本打開,選擇 “另存為",看文件的默認編碼是UTF-8還是ANSI,如果是ANSI則不帶BOM。
去掉文件中UTF-8格式BOM方法:
使用UlterEdit打開, 切換到十六進制編輯模式,把最前面三個字節(就是那該死的 EF BB BF)替換為20(空格ASCII碼值),保存(注意關閉保存時自動備份的功能),再切換到默認編輯模式,把最前面的三個空格去掉就可以了。
注意:
1. 如果模板采用包含的方法包含多個UTF-8文件時,則模板需要選擇UTF-8無BOM格式保存格式;
2. 用mb_convert_encoding / iconv 把gb2312文件轉換成UTF-8文件時,默認設置是不帶BOM的。不帶BOM可能出現上述亂碼問題,但是帶 BOM,對於PHP的include文件要小心,會在PHP字節流前面多出EF BB BF,提前輸出到顯示器有可能會帶來程序錯誤。一個解決方案是凡是被include的文件都保存為ANSI,主文件可以是UTF-8。
3. 如果中文頁面在html head標記中將title標記放在<meta http-equiv="content-type" content="text/html; charset=UTF-8″ />前面會導致頁面空白。所以UTF-8頁面應該使用標准順序為:
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-language" content="zh-CN" />
<meta content="index,follow" />
<meta content="" />
<meta content="" />
<meta content="general" />
<meta content="" />
<meta content="" />
<meta content="" />
<title></title>
編碼小知識:
所謂的unicode保存的文件實際上是UTF-16,只不過恰好跟unicode的碼相同而已,但在概念上unicode與UTF是兩回事,unicode是內存編碼表示方案,而UTF是如何保存和傳輸unicode的方案。UTF-16還分高位在前 (LE)和高位在后(BE)兩種。官方的UTF編碼還有UTF-32,也分LE和BE。非unicode官方的UTF編碼還有UTF-7,主要用於郵件傳輸。UTF-8的單字節部分是和iso-8859-1兼容的,這主要是一些舊的系統和庫函數不能正確處理UTF-16而被迫出來的,而且對英語字符來說,也節省保存的文件空間(以非英語字符浪費空間為代價)。在iso-8859-1的時候,UTF-8和iso-8859-1都是用一個字節表示的,當表示其它字符的時候,UTF-8會使用兩個或三個字節。