之前玩php程序的时候, 出了一个问题, 但肉眼就是看不出来, 百思不得其解。 我明明没有改动自己的php文件啊, 怎么就突然有bug了呢? 后来请教某哥, 他先查了当前php文件的格式, 怀疑是bom问题, 但当前文件是没有bom头的啊, 于是怀疑是基础的php中加入了bom头, 导致当前php有问题了, 后来果真如此, 厉害!
我在旁边看得一脸懵逼, 什么bom? 听都没听过! 英语是byte order mark. 后来自己也深入了解了一下bom的内容, 其实还是很简单的。 本文以utf-8为例, 来说说有bom和无bom是个什么情况。 请准备好notepad++/UltraEdit这两个基础的工具。
先用nodepad++写个文件, 内容是:abc, 可以查的16进制是616263, 这就对了, 而且从编辑器下面可以看到Dos\Windows, UTF8, 这些先不说了。
现在来转换为有bom的格式(如下是notepad的截图, 从我的经验看, UltraEdit的功能更为强大):
我们再看看16进制:ef bb bf 61 62 63, 看看, 多出来的ef bb bf就是bom头, 也就是文件头(这就是bom的本质), 有的程序/软件能识别它, 有的不能识别(此时就有问题了)
看来, bom头真不是个好东东, 肉眼还看不出问题呢
那怎么去掉这个bom头呢, 当然就可以用上面的notepad++和UltraEdit了, 但是, 不要忘了, linux命令才是行家, 来看看批量查找bom文件和批量去bom头的方法:
taoge@localhost Desktop> xxd a.txt
0000000: efbb bf61 6263 ...abc
taoge@localhost Desktop> xxd me/a.txt
0000000: efbb bf61 6263 ...abc
taoge@localhost Desktop> find . -type f -print0 | xargs -0r awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
./a.txt
./me/a.txt
taoge@localhost Desktop> find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;
taoge@localhost Desktop> xxd a.txt
0000000: 6162 63 abc
taoge@localhost Desktop> xxd me/a.txt
0000000: 6162 63 abc
taoge@localhost Desktop> find . -type f -print0 | xargs -0r awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
taoge@localhost Desktop>
哈哈, 就这么简单。