BOM: Byte Order Mark
UTF-8 BOM又叫UTF-8 簽名,其實UTF-8 的BOM對UFT-8沒有做用,
是爲了支援UTF-16,UTF-32才加上的BOM,BOM簽名的意思就是告訴編輯器當前文件採用何種編碼,
方便編輯器識別,可是BOM雖然在編輯器中不顯示,可是會產生輸出,就像多了一個空行,
BOM用於標記一個文本文件使用Unicode編碼,其自己是一個Unicode字符("\uFEFF"),位於文本文件頭部。在不一樣的Unicode編碼下,BOM字符對應的二進制字節以下:瀏覽器
Bytes Encoding ---------------------------- FE FF UTF16BE FF FE UTF16LE EF BB BF UTF8
所以,咱們能夠根據文本文件頭幾個字節等於啥來判斷文件是否包含BOM,以及使用哪一種Unicode編碼。可是,BOM字符雖然起到了標記文件編碼的做用,其自己卻不屬於文件內容的一部分,若是讀取文本文件時不去掉BOM,在某些使用場景下就會有問題。例如咱們把幾個JS文件合併成一個文件後,若是文件中間含有BOM字符,就會致使瀏覽器JS語法錯誤。所以,使用NodeJS讀取文本文件時,通常須要去掉BOM。例如,如下代碼實現了識別和去除UTF8 BOM的功能。編輯器
function readText(pathname) { var bin = fs.readFileSync(pathname); if (bin[0] === 0xEF && bin[1] === 0xBB && bin[2] === 0xBF) { bin = bin.slice(3); } return bin.toString('utf-8'); }