使用sed和find删除BOM
页面中出现了比样式中指定的更大的空白区域,审查元素发现HTML中多出了一个字符,当手动把这个字符删除后,样式就正常了。
然后Google ,发现是一个Unicode字符。
The character in question  is the Unicode Character 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF).
进一步Google U+FEFF发现U+FEFF实际上是UTF8编码文件中的BOM。
That isn't <U+FEFF>, that is <0xEF,0xBB,0xBF> that is the BOM of UTF8 files
然后什么是BOM呢
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。
可是为什么之前一直没有遇到过这个问题呢,因为类Unix系统是不会在文件中添加BOM的,而这一次服务端采用的是C#,环境是Windows,文件中多了这个字符。
在类Unix系统(大量使用文本文件,用于文件格式,用于进程间通信)中,这种作法则不被建议采用。因为它会妨碍到如解译器脚本开头的Shebang等的一些重要的码的正确处理。它亦会影响到无法识别它的编程语言。如gcc会报告源码档开头有无法识别的字符。
知道了字符是什么,接下来就是删除它了。
很多人提到通过设置notepad++的编码方式为以UTF-8无BOM格式编码,然后使用notepad++打开文件并保存的方法。
对于一两个文件,这是一个不错的方法。而且任何编辑器通过设置编码,然后打开文件并保存都可以做到。但是对于大量文件还是放弃手动操作吧。
我们有代码和工具呀。
现在我们重新描述一下问题:删除当前目录下所有文件中的一个字符,这个字符十六进制表示为<0xEF,0xBB,0xBF>。
然后就可以使用sed和find解决这个问题了。
$ sed -i 's/^\xEF\xBB\xBF//' `find -type f`下面进行简单的说明。
find不带任何参数时会搜索出当前目录及其子目录,不做任何筛选,即罗列出所有目录和文件。而sed只处理文件,所以添加了参数-type f筛选出其中的文件。
sed部分实现的是删除<0xEF,0xBB,0xBF>,通过指定参数-i覆盖源文件。
参考
why-is-65279-appearing-in-my-html