|
|
|
|
|
今天用PHP生成網(wǎng)頁(yè),瀏覽時(shí)發(fā)現(xiàn)有些問題,就是開頭總是空一行和出現(xiàn)幾個(gè)亂碼。一開始我以為是程序的問題,但是在逐步排查之后,并不是程序的原因。這就讓人有些疑惑了,一時(shí)還不知從哪入手去解決這個(gè)問題。
從表面來看,是內(nèi)容編碼問題,但是我在用PHP生成網(wǎng)頁(yè)時(shí)已經(jīng)嘗試過各種編碼,UTF-8,gb2312,甚至Unicode都用過,問題照舊。
通過查閱相關(guān)資料,有可能是PHP文件的保存編碼問題。
我一直用的是Editplus編輯器,保存編碼是UTF-8。
于是我換下保存編碼,ANSI,不行。
再換,UTF-8 BOM,咦!竟然沒問題了!這是咋回事?我一直用UTF-8都不行,用這個(gè)UTF-8 BOM竟然可以了???
我現(xiàn)在還不知這個(gè)帶BOM與不帶BOM的UTF-8有何區(qū)別。
但是現(xiàn)在我想我有必要去了解一下了。
先看圖
內(nèi)容都一樣 ,為什么相差了3個(gè)字節(jié)呢 ? 再看下圖 。
多出來的 ef bb bf 就是上面相差三個(gè)字節(jié)的原因 。
BOM——Byte Order Mark,就是字節(jié)序標(biāo)記。
bom是為utf-16和utf-32準(zhǔn)備的,用于標(biāo)記字節(jié)順序。微軟在utf-8中使用bom是因?yàn)檫@樣可以把UTF-8和ASCII等編碼區(qū)分開來,Windows就是使用BOM來標(biāo)記文本文件的編碼方式的,但這樣的文件在Windows之外的操作系統(tǒng)里會(huì)帶來問題。
PHP在設(shè)計(jì)時(shí)就沒有考慮BOM的問題,也就是說它不會(huì)忽略UTF-8編碼的文件開頭BOM的那三個(gè)字符。由于必須在<?
或者<?php
后面的代碼才會(huì)作為PHP代碼執(zhí)行,所以這三個(gè)字符將會(huì)直接輸出。
如果插件的文件有這個(gè)問題,將會(huì)導(dǎo)致在后臺(tái)頁(yè)面里激活或者不激活插件后顯示白屏,如果是模版文件有這個(gè)問題,將會(huì)導(dǎo)致這三個(gè)字符直接輸出,造成頁(yè)面上方有一個(gè)小空行。——這就解釋了為何我用PHP生成的網(wǎng)頁(yè)開頭有個(gè)空行亂碼了。
國(guó)外的英文插件和模版一般都是用的ASCII碼的編碼方式,不會(huì)有BOM,只有國(guó)內(nèi)的插件和模版會(huì)由于作者的不知情造成問題。還有,大家修改模版的時(shí)候,由于輸出頁(yè)面使用UTF-8編碼,那么修改模版的時(shí)候如果有加入中文字符的話,必須把文件轉(zhuǎn)成UTF-8編碼才能正常顯示,這個(gè)時(shí)候如果所使用的編輯器自動(dòng)加上了BOM的話,將會(huì)造成在頁(yè)面上輸出這三個(gè)字符,顯示效果就要看瀏覽器了,一般是一個(gè)空行或是一個(gè)亂碼。
現(xiàn)在各種各樣的編輯器,保存文件時(shí)如何選擇編碼格式,也是一大問題,如果選擇不對(duì),那么可能對(duì)程序的運(yùn)行就會(huì)產(chǎn)生影響,EditPlus保存選utf-8 bom就是文本文件保存時(shí)的utf-8。