最近有很多在微博上談論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()截取以後的文字寫入