14

Node.js去除文本文件BOM头

 3 years ago
source link: https://sobird.me/nodejs-strip-bom.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

字节顺序标记(byte order mark),是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的标记。

不同编码的字节顺序标记的表示:

编码表示(十六进制)表示(十进制)UTF8EF BB BF239 187 191UTF-16(大端序)FE FF254 255UTF-16(小端序)FF FE255 254UTF-32(大端序)00 00 FE FF0 0 254 255UTF-32(小端序)FF FE 00 00255 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;
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK