1. 程式人生 > 程式設計 >Node.js文字檔案BOM頭的去除方法

Node.js文字檔案BOM頭的去除方法

BOM

位元組順序標記(byte order mark),是位於碼點U+FEFF的統一碼字元的名稱。當以UTF-16或UTF-32來將UCS/統一碼字元所組成的字串編碼時,這個字元被用來標示其位元組序。它常被用來當做標示檔案是以UTF-8、UTF-16或UTF-32編碼的標記。

不同編碼的位元組順序標記的表示:

編碼 表示(十六進位制) 表示(十進位制)
UTF8 EF BB BF 239 187 191
UTF-16(大端序) FE FF 254 255
UTF-16(小端序) FF FE 255 254
UTF-32(大端序) 00 00 FE FF 0 0 254 255
UTF-32(小端序) FF FE 00 00 255 254 0 0

BOM新增

UTF8編碼不需要BOM,但是我們可以手動給UTF8編碼檔案新增一個BOM頭

const fs = require('fs');

fs.writeFile('./bom.js','\ufeffThis is an example with accents : é è à ','utf8',function (err) {})

BOM移除

對於UTF8來說,BOM的有無並不是必須的,因為UTF8位元組沒有順序,不需要標記,也就是說一個UTF8檔案可能有BOM,也可能沒有BOM。

根據不同編碼的BOM不同,我們可以根據檔案頭幾個位元組來判斷檔案是否包含BOM,以及使用的那種Unicode編碼。

BOM字元雖然起到了標記檔案編碼的作用,其本身卻不屬於檔案內容的一部分,如果讀取文字檔案時不去掉BOM,在某些使用場景下就會有問題。例如我們把幾個JS檔案合併成一個檔案後,如果檔案中間含有BOM字元,就會導致瀏覽器JS語法錯誤。因此,使用Node.js讀取文字檔案時,一般需要去掉BOM。

// 對於字串內容
function stripBOM(content) { 
 // 檢測第一個字元是否為BOM 
 if (content.charCodeAt(0) === 0xFEFF) {
 content = content.slice(1);
 }
 return content;
}

// 對於Buffer
function stripBOMBuffer(buf) { 
 if (buf[0] === 0xEF && buf[1] === 0xBB && buf[2] === 0xBF) { 
 buf = buf.slice(3); 
 } 
 return buf;
}

參考

  • 字元編碼筆記:ASCII,Unicode 和 UTF-8
  • 位元組順序標記

總結

到此這篇關於Node.js文字檔案BOM頭去除的文章就介紹到這了,更多相關Node.js文字檔案BOM頭去除內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!