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); })