UTF-8编码中BOM的检测与删除
原文:http://huoding.com/2011/05/14/78
所谓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
分享到:
相关推荐
2. **BOM(Byte Order Mark)**:在UTF-8编码中,BOM是字节序列`0xEF, 0xBB, 0xBF`,它不是必须的,但可以用来标识文件是用UTF-8编码的。对于大多数现代文本编辑器和浏览器来说,它们能够识别并忽略这个标记。然而,...
所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break ...
标题"Python-convert2utf将目录下的全部源文件转成UTF8编码"指的是使用Python编写的一个脚本或工具,该工具能够遍历指定目录,检测并转换其中的GB、GBK以及其他非UTF-8编码的文本文件和源代码文件,统一转换为UTF-8...
BOM通常用于UTF-16和UTF-32编码的文件中来标识字节顺序,但在UTF-8编码中它不是必需的。当程序不正确地处理带有BOM的文件时,可能会导致数据格式错误或显示问题。 在PHP开发中,批量删除或清除UTF-8文件的BOM头可以...
标题中的“文件BOM批量删除工具”指的是一个专门设计用于处理文本文件的软件,它的主要功能是删除UTF-8、UTF-16和UTF-32编码格式的文件中的字节顺序标记(BOM)。BOM,即Byte Order Mark,是在某些Unicode编码中用于...
使用这个工具的步骤可能包括:解压文件,运行工具,选择需要处理的文件或文件夹,然后工具会自动检测并去除指定文件的BOM头,或者将整个文件集转换为无BOM的UTF-8编码。 总的来说,这个工具是为了解决开发过程中...
BOM是Unicode编码标准中的一种标记,用于标识文件是以UTF-8编码的。在某些情况下,BOM可能会引起问题,比如在某些编程语言中未正确处理它时,可能会导致额外的空白字符或者显示异常。 描述中提到,这款工具是用于...
在IT行业中,BOM(Byte Order Mark)是一个特殊字符,主要用于标识文本文件的编码格式,尤其是在UTF-8编码中常见。BOM头并不是必须的,但在某些情况下可能会引起问题,例如在JavaScript处理JSON数据或者在网页显示...
在UTF-8编码中,BOM头由三个字节组成(0xEF, 0xBB, 0xBF),它并不是必须的,但有时候会被添加到文件的开头来表明该文件是采用UTF-8编码。尽管BOM头对于某些程序来说是有用的,但它可能会引起一些问题,尤其是在处理...
BOM是Unicode字符集的一个标记,它用于标识文本文件的编码类型,通常在UTF-8编码的文件中出现。在某些情况下,BOM可能会引起不必要的问题,例如在编程或网页显示时,因此有时需要去除。 描述中提到的“去除bom的小...
工具也可能提供选项来处理含有BOM的文件,因为UTF-8编码可以有或没有BOM。此外,对于无法确定编码的文件,工具通常会提示用户手动选择正确的编码。 编码转换在日常工作中非常重要,例如在开发跨平台应用时,确保...
BOM是UTF-8编码的一个签名,由三个字节(0xEF, 0xBB, 0xBF)组成,用来指示文件是以UTF-8编码的。在某些情况下,例如当文件被某些不支持BOM的编辑器打开时,这三个字节可能导致乱码或者在浏览器中产生额外的空白字符...
对于使用UTF-8编码的文本文件,特别是编程源代码,通常推荐使用无BOM版本,以防止可能出现的解析问题。而这个批量去除BOM工具无疑是一个实用的辅助工具,可以帮助开发者轻松解决由BOM引发的困扰。
"基于PHP的BOM移除工具"是指用于处理UTF-8编码文件中Byte Order Mark (BOM) 的工具。BOM是一个特殊的Unicode字符序列,通常出现在UTF-8编码的文件开头,用来标识文件的编码方式。然而,在某些情况下,BOM的存在可能...
在UTF-8编码中,BOM表现为EF BB BF这三个字节,而在UTF-16/UCS-2编码中,BOM表现为FE FF,用于表示字节序。UTF-16编码分为小端序(little-endian)和大端序(big-endian)两种,BOM也可以用来指示这两种不同的字节序...
BOM,全称为字节顺序标记,是UTF-8编码格式的一个特殊字符序列,用于标识文件是以UTF-8编码的。在某些情况下,BOM头可能会引起问题,例如当PHP文件被作为文本处理时,BOM头可能导致乱码或者在浏览器中显示额外的空白...
在IT行业中,BOM(Byte Order Mark)是一个重要的概念,特别是在处理UTF-8编码的文本文件时。BOM是Unicode编码标准中用于标识文件字符集和字节顺序的一个特殊字符。在某些情况下,BOM的存在可能会导致程序读取或解析...
# 将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 ...
utfbom软件包utfbom实现了BOM(Unicode字节顺序标记)的检测并根据需要删除。 它还可以返回BOM表检测到的编码。 安装go get -u github.com/dimchansky utfbom软件包utfbom实现了BOM(Unicode字节顺序标记)的检测并...
尤其在处理UTF-8编码的文本文件时,BOM常常会在文件的开头出现。对于PHP开发者来说,BOM可能会引起一些不必要的问题,比如导致预览时出现乱码或者影响代码的正确执行。因此,理解和掌握如何批量去除BOM就显得尤为...