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

作者:袖梨 2022-11-14

下图是出现前面说的情况后用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.111com.net/ | head -1 | sed -n l
锘� //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,一切解决

相关文章

精彩推荐