BOM是用來判斷文本文件是哪種Unicode編碼的標記,其自己是一個Unicode字符("\uFEFF"),位於文本文件頭部。html
在不一樣的Unicode編碼中,對應的bom的二進制字節以下:node
FE FF UTF16BE
FF FE UTF16LE
EF BB BF UTF8瀏覽器
因此咱們能夠根據文件頭部的幾個字節和上面的表格對應來判斷該文件是哪一種編碼形式。ui
BOM頭在記事本中是看不到的編碼
以UTF8爲例,新建一個1.txt文件,而後打開文件 輸入 hello world 而後另存爲 此時更改文件的編碼格式 由默認的ANSI 即GB2312(國標2312)編碼改爲UTF8code
而後經過下面的node代碼,來打印該文本文件的buffer 就能夠看到咱們所說的BOM頭字符htm
let fs = require('fs'); fs.readFile('./1.txt',function(err,data){ console.log(data) }) // <Buffer ef bb bf 68 65 6c 6c 6f 20 77 6f 72 6c 64> // 前三個字節就是對應的咱們UTF8編碼的文本的BOM頭字符
雖然BOM字符起到了標記文件編碼的做用可是他並不屬於文件的內容部分,因此會產生一些問題:字符串
1.在某些使用場景下就會有問題。例如咱們把幾個JS文件合併成一個文件後,若是文件中間含有BOM字符,就會致使瀏覽器JS語法錯誤。it
2.PHP就不能識別bom頭,PHP並不會忽略BOM,因此在讀取、包含或者引用這些文件時,會把BOM做爲該文件開頭正文的一部分。根據嵌入式語言的特色,這串字符將被直接執行(顯示)出來。由此形成即便頁面的 top padding 設置爲0,也沒法讓整個網頁緊貼瀏覽器頂部,由於在html一開頭有這3個字符呢!io
方法一:在文件另存爲的時候選擇無BOM頭的UTF8編碼
方法二:使用node中的文件模塊獲取文件的buffer數據並去掉前三個字節,代碼以下:
function deleteUtf8BomHead(path) { let buf = fs.readFileSync(path); if (buf[0] == 0xef && buf[1] == 0xbb && buf[2] == 0xbf) { buf = buf.slice(3) } return buf } console.log(deleteUtf8BomHead('./1.txt'));// <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
// 將GBK編碼的buffer轉化成utf8的字符串 // 在這裏咱們要引入一個庫 iconv-lite let iconv = require('iconv-lite'); fs.readFile('./2.txt',function (err, data) { console.log(data,'qq'); let str = iconv.decode(data,'gbk'); console.log(str); })