`
wanghailiang333
  • 浏览: 199565 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

【转】UTF-8编码中BOM的检测与删除

 
阅读更多

UTF-8编码中BOM的检测与删除

所谓BOM,全称是Byte Order Mark ,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space 。 注:Unicode相关知识的详细介绍请参考UTF-8, UTF-16, UTF-32 & BOM 。 对于UTF-8/16/32而言,它们名字中的8/16/32指的是编码单位是多少位的,也就是说,它们的编码单位分别是8/16/32位,换算成字节就 是1/2/4字节,如果是多字节,就要牵扯到字节序,UTF-8以单字节为编码单位,所以不存在字节序。 UTF-8主要的优点是可以兼容ASCII,但如果使用BOM的话,这个好处就荡然无存了,除此以外,BOM的存在还可能引发一些问题,比如下面错误便都 有可能是BOM导致的:

  • Shell: No such file or directory
  • PHP: Warning: Cannot modify header information – headers already sent

在详细讨论UTF-8编码中BOM的检测与删除问题前,不妨先通过一个例子热热身:

shell> curl -s http://phone.10086.cn/ | head -1 | sed -n l
\357\273\277<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional\
//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r$

如上所示,前三个字节分别是357、273、277,这就是八进制的BOM。

shell> curl -s http://phone.10086.cn/ | 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 $'^\xEF\xBB\xBF' /path

如何删除UTF-8编码中的BOM呢?

shell> grep -r -I -l $'^\xEF\xBB\xBF' /path | xargs sed -i 's/^\xEF\xBB\xBF//;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 $'^\xEF\xBB\xBF'; then
        echo "Byte Order Mark be found in $FILE" 1>&2
        exit 1
    fi
done
分享到:
评论

相关推荐

    php utf-8编码去bom小工具

    2. **BOM(Byte Order Mark)**:在UTF-8编码中,BOM是字节序列`0xEF, 0xBB, 0xBF`,它不是必须的,但可以用来标识文件是用UTF-8编码的。对于大多数现代文本编辑器和浏览器来说,它们能够识别并忽略这个标记。然而,...

    UTF-8 编码中BOM的检测与删除

    所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break ...

    Python-convert2utf将目录下的全部源文件转成UTF8编码

    标题"Python-convert2utf将目录下的全部源文件转成UTF8编码"指的是使用Python编写的一个脚本或工具,该工具能够遍历指定目录,检测并转换其中的GB、GBK以及其他非UTF-8编码的文本文件和源代码文件,统一转换为UTF-8...

    PHP批量删除、清除UTF-8文件BOM头的代码实例

    BOM通常用于UTF-16和UTF-32编码的文件中来标识字节顺序,但在UTF-8编码中它不是必需的。当程序不正确地处理带有BOM的文件时,可能会导致数据格式错误或显示问题。 在PHP开发中,批量删除或清除UTF-8文件的BOM头可以...

    文件BOM批量删除工具

    标题中的“文件BOM批量删除工具”指的是一个专门设计用于处理文本文件的软件,它的主要功能是删除UTF-8、UTF-16和UTF-32编码格式的文件中的字节顺序标记(BOM)。BOM,即Byte Order Mark,是在某些Unicode编码中用于...

    去除BOM文件头工具

    使用这个工具的步骤可能包括:解压文件,运行工具,选择需要处理的文件或文件夹,然后工具会自动检测并去除指定文件的BOM头,或者将整个文件集转换为无BOM的UTF-8编码。 总的来说,这个工具是为了解决开发过程中...

    批量去除 bom 工具

    对于使用UTF-8编码的文本文件,特别是编程源代码,通常推荐使用无BOM版本,以防止可能出现的解析问题。而这个批量去除BOM工具无疑是一个实用的辅助工具,可以帮助开发者轻松解决由BOM引发的困扰。

    BOM检测工具 v1.0.0.rar

    BOM是Unicode编码标准中的一种标记,用于标识文件是以UTF-8编码的。在某些情况下,BOM可能会引起问题,比如在某些编程语言中未正确处理它时,可能会导致额外的空白字符或者显示异常。 描述中提到,这款工具是用于...

    去除所有页面BOM头

    在IT行业中,BOM(Byte Order Mark)是一个特殊字符,主要用于标识文本文件的编码格式,尤其是在UTF-8编码中常见。BOM头并不是必须的,但在某些情况下可能会引起问题,例如在JavaScript处理JSON数据或者在网页显示...

    什么是BOM头,如何去掉BOM头.zip

    在UTF-8编码中,BOM头由三个字节组成(0xEF, 0xBB, 0xBF),它并不是必须的,但有时候会被添加到文件的开头来表明该文件是采用UTF-8编码。尽管BOM头对于某些程序来说是有用的,但它可能会引起一些问题,尤其是在处理...

    文本文件编码转换

    工具也可能提供选项来处理含有BOM的文件,因为UTF-8编码可以有或没有BOM。此外,对于无法确定编码的文件,工具通常会提示用户手动选择正确的编码。 编码转换在日常工作中非常重要,例如在开发跨平台应用时,确保...

    基于PHP的BOM移除工具源码.zip

    BOM是UTF-8编码的一个签名,由三个字节(0xEF, 0xBB, 0xBF)组成,用来指示文件是以UTF-8编码的。在某些情况下,例如当文件被某些不支持BOM的编辑器打开时,这三个字节可能导致乱码或者在浏览器中产生额外的空白字符...

    基于PHP的BOM移除工具.zip

    "基于PHP的BOM移除工具"是指用于处理UTF-8编码文件中Byte Order Mark (BOM) 的工具。BOM是一个特殊的Unicode字符序列,通常出现在UTF-8编码的文件开头,用来标识文件的编码方式。然而,在某些情况下,BOM的存在可能...

    PHP中遇到BOM、&lt;feff&gt;编码导致json_decode函数无法解析问题

    在UTF-8编码中,BOM表现为EF BB BF这三个字节,而在UTF-16/UCS-2编码中,BOM表现为FE FF,用于表示字节序。UTF-16编码分为小端序(little-endian)和大端序(big-endian)两种,BOM也可以用来指示这两种不同的字节序...

    基于PHP的风吟PHP版BOM移除工具源码.zip

    BOM,全称为字节顺序标记,是UTF-8编码格式的一个特殊字符序列,用于标识文件是以UTF-8编码的。在某些情况下,BOM头可能会引起问题,例如当PHP文件被作为文本处理时,BOM头可能导致乱码或者在浏览器中显示额外的空白...

    BOM清除小工具.rar_BOM

    在IT行业中,BOM(Byte Order Mark)是一个重要的概念,特别是在处理UTF-8编码的文本文件时。BOM是Unicode编码标准中用于标识文件字符集和字节顺序的一个特殊字符。在某些情况下,BOM的存在可能会导致程序读取或解析...

    WEB渗透测试数据库

    # 将utf-8编码的文件test.txt转换为gbk编码的gbk.txt pen.py file test.txt@utf8 -c gbk.txt@gbk # 文件转换,转换为utf-16-bom类型文件(jsp/aspx的utf-16-bom类型文件可绕过一些安全软件) pen.py file cmd.jsp -c ...

    检测BOM并根据需要删除-Golang开发

    utfbom软件包utfbom实现了BOM(Unicode字节顺序标记)的检测并根据需要删除。 它还可以返回BOM表检测到的编码。 安装go get -u github.com/dimchansky utfbom软件包utfbom实现了BOM(Unicode字节顺序标记)的检测并...

    批量去除bom的代码

    尤其在处理UTF-8编码的文本文件时,BOM常常会在文件的开头出现。对于PHP开发者来说,BOM可能会引起一些不必要的问题,比如导致预览时出现乱码或者影响代码的正确执行。因此,理解和掌握如何批量去除BOM就显得尤为...

    去除BOM头小工具

    选择要遍历的文件夹,输入相应的文件格式,程序会遍历此...勾选ANSI转为UTF-8,则会将相应格式但编码为GB2312,GBK,GB18030的文件转为无BOM的UTF-8文件 请确保文件可写!使用前请做好备份,作者不承担任何法律责任

Global site tag (gtag.js) - Google Analytics