Home >php教程 >php手册 >检测与删除页面BOM(UTF-8)空行方法

检测与删除页面BOM(UTF-8)空行方法

WBOY
WBOYOriginal
2016-06-13 09:51:16976browse

我们经常会在发现页面中无故多了一些空白行了,但在编辑器中又看到到,这个我们知道是由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

 代码如下 复制代码

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

移除 BOM function

 代码如下 复制代码

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
锘�br /> //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  |...
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,一切解决

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn