好兄弟友情支持的虛擬主機(jī)最近老出問(wèn)題,仔細(xì)詢問(wèn)了緣由,看來(lái)還是技術(shù)維護(hù)人員不到位造成,且服務(wù)器是Win2003+IIS,不穩(wěn)定之余對(duì)PHP的支持也存在些微的問(wèn)題. 不想去埋怨什么,期待早點(diǎn)完成維護(hù)即可.

  今天上午挺意外的發(fā)現(xiàn)服務(wù)器恢復(fù),但我的Movie Castle頁(yè)面顯示卻很奇怪...全屏,且上方多了一行小空行,測(cè)試瀏覽器為IE7.然后去Firefox下查看,發(fā)現(xiàn)頁(yè)面的Width正常,但上方的小空行依然存在-.-

  我是善于Google的人,于是遇到不明白的先詢問(wèn)這本百科全書(shū). 得到的答案是主題PHP文件編碼是UTF-8 with bom造成的,至于這個(gè)bom是什么,看下這個(gè)中文解釋吧.

  在UCS 編碼中有一個(gè)叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應(yīng)該出現(xiàn)在實(shí)際傳輸中。UCS規(guī)范建議我們?cè)趥鬏斪止?jié)流前,先傳輸 字符"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個(gè)字節(jié)流是Big-Endian的;如果收到FFFE,就表明這個(gè)字節(jié)流是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。

  UTF-8不需要BOM來(lái)表明字節(jié)順序,但可以用BOM來(lái)表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF。所以如果接收者收到以EF BB BF開(kāi)頭的字節(jié)流,就知道這是UTF-8編碼了。

  Windows就是使用BOM來(lái)標(biāo)記文本文件的編碼方式的。

 

  很顯然...我的小空行是因?yàn)檫@個(gè)bom而產(chǎn)生的.

  找到問(wèn)題后的就是解決問(wèn)題.去WP群里問(wèn)了聲,得到了一些建議,但個(gè)人覺(jué)得CSS樣式之前在相同的環(huán)境下沒(méi)有一點(diǎn)問(wèn)題,沒(méi)理由現(xiàn)在突然顯示不了! 還是先解決已知問(wèn)題吧...Google告訴我了很多去除bom的方法,但操作上來(lái)講都有點(diǎn)煩,最后終于找到了個(gè)稱心如意滴~muhahaha 一個(gè)自動(dòng)移除bom的小程序...備份后大膽的試用,果然問(wèn)題立刻解決.

 

<?php
//remove the utf-8 boms
//by magicbug at gmail dot com

if (isset($_GET['dir'])){ //config the basedir
$basedir=$_GET['dir'];
}else{
$basedir = '.';
}

$auto = 1;

checkdir($basedir);

function checkdir($basedir){
if ($dh = opendir($basedir)) {
   while (($file = readdir($dh)) !== false) {
    if ($file != '.' && $file != '..'){
     if (!is_dir($basedir."/".$file)) {
      echo "filename: $basedir/
$file ".checkBOM("$basedir/$file")." <br>";
     }else{
      $dirname = $basedir."/".
$file;
      checkdir($dirname);
     }
    }
   }
closedir($dh);
}
}

function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 &&
ord($charset[3]) == 191) {
   if ($auto == 1) {
    $rest = substr($contents, 3);
    rewrite ($filename, $rest);
    return ("<font color=red>BOM found,
automatically removed.</font>");
   } else {
    return ("<font color=red>BOM found.
</font>");
   }
}
else return ("BOM Not Found.");
}

function rewrite ($filename, $data) {
$filenum = fopen($filename, "w");
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>