笨方法移除UTF-8 BOM

May 21, 2013

前几天拿到一个系统的代码,编译编译不了,javac不支持UTF8-BOM的文件。通过一系列的笨方法干掉邪恶的BOM。

识别带BOM的文件

文件这么多,万一有些不带BOM,然后我又把它处理了不就很悲剧,所以先识别出带BOM的文件。知道BOM是何物的高手自然先检查一下文件开头的几个字节,这对我来说太难了,所以我用file

$ file BbsCategory.java
BbsCategory.java: UTF-8 Unicode (with BOM) text, with CRLF, LF line terminators

所以我们只要对全部文件用file识别一下,用grep、awk、sed过滤出全部带BOM的文件:

file `find . -name "*.java"` \
    | grep '(with BOM)' \
    | awk '{print $1}' \
    | sed s/:// > hasbom

顺便把结果放到一个hasbom文件里,方便检查和进行下一步。

移除BOM

我们当然可以sed换掉文件前4个字节,sed不熟所以直接用tail跳过前4字节就可以了

for i in $(cat hasbom) ; do
    tail --bytes=+4 $i > tmp
    cp tmp $i
done

其实就是我不会用sed而已。