下图是出现前面说的情况后用firebug看到的HTML代码。
图1
里面莫名其妙多出了一个空白行,而我们看源代码里面却没有。
我最常用的办法,利用php替换
BOM: 万国码档案签名 BOM (Byte Order Mark, U+FEFF)
BOM 的内容可以表示 UNICODE 是哪种编码, 但是在接收到的档案, 要拆解后写入 DB, 看到 BOM 就觉得有点 ooxx.
在 utf8_encode 看到两段程式可以来测试 写入/移除 BOM.
将写入的档案内容前加 BOM
代码如下 | 复制代码 |
function writeUTF8File($filename,$content) |
移除 BOM function
代码如下 | 复制代码 |
function removeBOM($str = '') |
由此上述 BOM = pack("CCC",0xef,0xbb,0xbf), 所以移除 BOM 的写法可用上面的 removeBOM function 或 下述其一:
■str_replace("锘�", '', $bom_content);
■preg_replace("/^锘�/", '', $bom_content);
另外看到 判断此字串是不是 UTF-8 的 function:
代码如下 | 复制代码 |
function isUTF8($string) |
linux系统中使用shell来解决
在详细讨论UTF-8编码中BOM的检测与删除问题前,不妨先通过一个例子热热身:
代码如下 | 复制代码 |
shell> curl -s http://www.111com.net/ | head -1 | sed -n l 锘� $ |
如上所示,前三个字节分别是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" SVNLOOK=/usr/bin/svnlook for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}'); do |
本文用到了很多shell命令
方法三,利用ultraedit编辑器直接修改文档
把出现空行的文档另存没没有BOM的格式就行了。
下图是ultraedit保存文档时的编码格式:
图2
选择里面的UTF8-无BOM,一切解决