程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 檢測與刪除頁面BOM(UTF-8)空行方法

檢測與刪除頁面BOM(UTF-8)空行方法

編輯:關於PHP編程

我們經常會在發現頁面中無故多了一些空白行了,但在編輯器中又看到到,這個我們知道是由BOM(UTF-8)導致的,下面小編來給大家分享幾種關於BOM(UTF-8)檢測與刪除方法。

下圖是出現前面說的情況後用firebug看到的HTML代碼。

圖1

裡面莫名其妙多出了一個空白行,而我們看源代碼裡面卻沒有。


我最常用的辦法,利用php替換

BOM: 萬國碼檔案簽名 BOM (Byte Order Mark, U+FEFF)

BOM 的內容可以表示 UNICODE 是哪種編碼, 但是在接收到的檔案, 要拆解後寫入 DB, 看到 BOM 就覺得有點 ooxx.


在 utf8_encode 看到兩段程式可以來測試 寫入/移除 BOM.

將寫入的檔案內容前加 BOM

 代碼如下 復制代碼

<?php
function writeUTF8File($filename,$content)
{
    $f = fopen($filename, 'w');
    fwrite($f, pack("CCC", 0xef,0xbb,0xbf));
    fwrite($f,$content);
    fclose($f);
}
?>

移除 BOM function

 代碼如下 復制代碼

<?php
function removeBOM($str = '')
{
   if (substr($str, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
       $str = substr($str, 3);
   }
   return $str;
}
?>

由此上述 BOM = pack("CCC",0xef,0xbb,0xbf), 所以移除 BOM 的寫法可用上面的 removeBOM function 或 下述其一:

■str_replace("锘�", '', $bom_content);
■preg_replace("/^锘�/", '', $bom_content);
另外看到 判斷此字串是不是 UTF-8 的 function:

 代碼如下 復制代碼

function isUTF8($string)
{
    return (utf8_encode(utf8_decode($string)) == $string);
}

linux系統中使用shell來解決

在詳細討論UTF-8編碼中BOM的檢測與刪除問題前,不妨先通過一個例子熱熱身:

 代碼如下 復制代碼 shell> curl -s http://www.bKjia.c0m/ | head -1 | sed -n l
锘�<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional
//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> $

如上所示,前三個字節分別是357、273、277,這就是八進制的BOM。

 代碼如下 復制代碼 shell> curl -s http://www.111cn.Net/ | head -1 | hexdump -C
00000000  ef bb bf 3c 21 44 4f 43  54 59 50 45 20 68 74 6d  |...<!DOCTYPE htm|
00000010  6c 20 50 55 42 4c 49 43  20 22 2d 2f 2f 57 33 43  |l PUBLIC "-//W3C|
00000020  2f 2f 44 54 44 20 58 48  54 4d 4c 20 31 2e 30 20  |//DTD XHTML 1.0 |
00000030  54 72 61 6e 73 69 74 69  6f 6e 61 6c 2f 2f 45 4e  |Transitional//EN|
00000040  22 20 22 68 74 74 70 3a  2f 2f 77 77 77 2e 77 33  |" "http://www.w3|
00000050  2e 6f 72 67 2f 54 52 2f  78 68 74 6d 6c 31 2f 44  |.org/TR/xhtml1/D|
00000060  54 44 2f 78 68 74 6d 6c  31 2d 74 72 61 6e 73 69  |TD/xhtml1-transi|
00000070  74 69 6f 6e 61 6c 2e 64  74 64 22 3e 0d 0a        |tional.dtd">..|

如上所示,前三個字節分別是EF、BB、BF,這就是十六進制的BOM。 注:用到了第三方網站的頁面,不能保證例子始終可用。 實際做項目開發時,可能會面對成百上千個文本文件,如果有幾個文件混入了BOM,那麼很難察覺,如果沒有帶BOM的UTF-8文本文件,可以用vi杜撰幾個,相關命令如下:

設置UTF-8編碼:

 代碼如下 復制代碼 :set fileencoding=utf-8

添加BOM:

 代碼如下 復制代碼 :set bomb

刪除BOM:

 代碼如下 復制代碼 :set nobomb

查詢BOM:

 代碼如下 復制代碼 :set bomb?

如何檢測UTF-8編碼中的BOM呢?

 代碼如下 復制代碼

shell> grep -r -I -l $'^锘�' /path如何刪除UTF-8編碼中的BOM呢?

shell> grep -r -I -l $'^锘�' /path | xargs sed -i 's/^锘�//;q'

推薦:如果你使用SVN的話,可以在pre-commit鉤子裡加上相關代碼用以杜絕BOM。

 代碼如下 復制代碼

#!/bin/bash

REPOS="$1"
TXN="$2"

SVNLOOK=/usr/bin/svnlook

for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}'); do
    if $SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | grep -q $'^锘�'; then
        echo "Byte Order Mark be found in $FILE" 1>&2
        exit 1
    fi
done

本文用到了很多shell命令

方法三,利用ultraedit編輯器直接修改文檔

把出現空行的文檔另存沒沒有BOM的格式就行了。

下圖是ultraedit保存文檔時的編碼格式:

圖2

選擇裡面的UTF8-無BOM,一切解決

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved