2017-07-26 14:33:10 3188瀏覽
PHP5中的file_get_contents函數(shù)獲取文件內(nèi)容,實(shí)際是按二進(jìn)制來讀取的,所以,當(dāng)你用file_get_contents去獲取一個帶BOM的UTF-8文件時,它并不會把UTF-8的BOM去掉,當(dāng)你把讀取的內(nèi)容當(dāng)作文本內(nèi)容來進(jìn)行一些操作時,可能會發(fā)生一些意想不到的結(jié)果。這并不能算作一個BUG,因?yàn)閒ile_get_contents函數(shù)讀取文件的時候,是按二進(jìn)制來讀取的,讀取到的內(nèi)容是包含BOM的,而用戶操作的時候,想當(dāng)然的以為讀取到的內(nèi)容是不包含BOM的文本內(nèi)容(如用記事本打開后看到的內(nèi)容),因?yàn)锽OM在編輯軟件中是不可見的,只有在十六進(jìn)制模式下才可以看見,問題也就出在這,實(shí)際上是由于“操作不統(tǒng)一”造成的。
當(dāng)對UTF-8編碼的文件進(jìn)行操作時,如果要把讀取的內(nèi)容當(dāng)作文本內(nèi)容來處理,最好先對BOM進(jìn)行一些處理,這個問題在PHP6中得到了解決(可以設(shè)置文本/二進(jìn)制讀取模式),有興趣的朋友可以自己查找PHP6的手冊。
一個較簡單的解決方法:
或者用正則來處理:
什么是BOM?
BOM是Byte Order Mark的縮寫,即字節(jié)順序標(biāo)記,它是插入到UTF-8,UTF-16或UTF-32編碼的Unicode文件開頭的特殊標(biāo)記,用來標(biāo)識Unicode文件的編碼類型。
幾種編碼對應(yīng)的BOM:
對于UTF-8編碼的文件而言,BOM標(biāo)記是可有可無的,Windows自帶的記事本文件在保存為UTF-8編碼時,會自動加上BOM,現(xiàn)在一些編輯軟件,可以在保存為UTF-8編碼時可以選擇是否帶BOM保存。
對于PHP文件,在使用UTF-8編碼時,最好都不要BOM保存。因?yàn)楫?dāng)你使用include/require/include_once/require_once這些函數(shù)去包含一個帶BOM的文件時,你得到的網(wǎng)頁,在某些兼容性不是很好的瀏覽器下,你會發(fā)現(xiàn)你的網(wǎng)頁的實(shí)際顯示效果跟預(yù)期的有細(xì)微的差別。