最近有很多在微博上谈论BOM头问题,BOM头会形成页面展现的乱码,xml分析出现问题。而我恰巧遇到一种状况,在wml页面中若是加上BOM头,PC浏览器(IE,火狐)和手机浏览器(UC)都很正常,而若是去除BOM头,则手机端正常,PC端不正常。为此,对BOM头和编码作些简单的研究。php
一、什么是BOM头linux
对于使用windows的记事本编辑文本,在采用UTF-8编码保存的时候,会给文本加上三个看不见的字节 0xEF 0xBB 0xBF,有些文章把这三个字节称为三个字符 是不对的,实际上这三个字节若是按照UTF-8解码,表示的是一个字符,这个字符表示没有显示,又不一样于空格,咱们先把这三个字节作一下转换windows
编码 | UTF8编码16进制 | unicode编码16进制 | unicode编码10进制 |
值 | EFBBBF | FEFF | 65279 |
经过网上根据编码查看汉字的工具查看确认一下(http://www.mytju.com/classcode/tools/encode_utf8.asp)浏览器
能够看出来,这是一个没有任何显示的字符,那么这样一个字符的用处是什么呢?实际上这个字符被windows的文本编辑器用来做为字符编码区分的标记,在windows系统下,一旦发现文本的前三个字节是EFBBBF,则确认整个文本是按照utf-8作的编码。服务器
二、BOM头的通常处理过程编辑器
a、linux下查看文件是否有BOM头的办法工具
通常的linux服务器带有一个xxd命令,能够以16进制的形式打开查看。
编码
b、查看项目下面哪些文件拥有bom头spa
方法不少,网上通常提供grep -r -I -l $'^\xEF\xBB\xBF' ./ 也就是在一个项目下,循环项目里面的文件,不区分大小写,查看是否已十六进制下的EFBBBF开头的文件,输出文件名信息
code
c、去除bom头
单个文件去除bom头能够用Vi打开文件,set nobomb后保存一下就能够去除,同理若是想加bom头,set bomb便可, 而若是去除某个项目下全部存在bom头的文件,通常须要写脚原本实现,在php下面 a一、循环读取每个文件 b一、利用substr()查看文件的前三个字节,将字节转成十进制查看 "EF" => 239 "BB" => 187 "BF" => 191 c一、若是查看到前三个字节是BOM头,则用substr()截取以后的文字写入