什么是文件的BOM头

1.什么是BOM?

BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部。

在不同的Unicode编码中,对应的bom的二进制字节如下:

Bytes Encoding

FE FF UTF16BE
FF FE UTF16LE
EF BB BF UTF8

所以我们可以根据文件头部的几个字节和上面的表格对应来判断该文件是哪种编码形式。

2. 如何查看你文件的BOM字符?

BOM头在记事本中是看不到的

以UTF8为例,新建一个1.txt文件,然后打开文件 输入 hello world 然后另存为 此时更改文件的编码格式 由默认的ANSI 即GB2312(国标2312)编码改成UTF8

然后通过下面的node代码,来打印该文本文件的buffer 就可以看到我们所说的BOM头字符

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头字符

3.存在的问题?

虽然BOM字符起到了标记文件编码的作用但是他并不属于文件的内容部分,所以会产生一些问题:

1.在某些使用场景下就会有问题。例如我们把几个JS文件合并成一个文件后,如果文件中间含有BOM字符,就会导致浏览器JS语法错误。

2.PHP就不能识别bom头,PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

4.如何去掉UTF8编码的记事本文件的BOM头

方法一:在文件另存为的时候选择无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);
})

原文地址:https://www.cnblogs.com/cangqinglang/p/11056423.html

时间: 2024-11-10 03:52:26

什么是文件的BOM头的相关文章

批量去除文件的BOM头

<?php class KillBom{ //定义扩展名 public static $m_ext = ['txt','php','js','css']; /** * 传入一个任意文件,自动区分定义的扩展名,然后过滤 * @param string $file * @return boolean */ public static function killBomByFile($file) { //获取一个文件的扩展名 $ext = pathinfo($file,PATHINFO_EXTENSIO

关于csv文件的BOM头

使用golang生成csv文件,可直接使用excel打开查看 golang生成的文件编码格式默认为utf-8格式,无BOM头,在windows上双击csv文件打开后中文会乱码 在新创建的文件的第一行写入这三个字符,可以解决中文乱码问题. f.Write([]byte{0xEF, 0xBB, 0xBF}) 原文地址:https://www.cnblogs.com/yklszm/p/10773628.html

史上最牛逼的文件bom头清除代码,万能检测清除php,js等等

做php开发,经常部分uft8的php文件因BOM头不同导致各种错误和错位.网上搜到的大部分所谓的去处bom工具都是2货,没有能用的.下面的一段代码,请复制到一个php文件里,然后上传到你的网站根目录下,然后前台访问,他会自动将站点下所有目录及子目录里的各种文件的bom干掉,会自动判断的哟. <?php // 设定你要清除BOM的根目录(会自动扫描所有子目录和文件)$HOME = dirname(__FILE__);// 如果是Windows系统,修改为:$WIN = 1;$WIN = 0;?>

关于JSON解析的深坑之BOM头

    前言:在我们对Json字符串进行处理时,往往会碰到这个问题org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject,解析服务器返回的Json串时,JSONObject对象抛出了这个异常.其实这是返回的Json字符串含有BOM头导致的. 本人手拙,写的不好.望各位大虾见谅!!! 什么是JSON?  JSON(JavaScript Object Notation) 是一种轻

BOM头问题

最近有不少在微博上谈论BOM头问题,BOM头会造成页面展示的乱码,xml分析出现问题.而我恰巧遇到一种情况,在wml页面中如果加上BOM头,PC浏览器(IE,火狐)和手机浏览器(UC)都很正常,而如果去除BOM头,则手机端正常,PC端不正常.为此,对BOM头和编码做些简单的研究. 1.什么是BOM头 对于使用windows的记事本编辑文本,在采用UTF-8编码保存的时候,会给文本加上三个看不见的字节 0xEF 0xBB 0xBF,有些文章把这三个字节称为三个字符 是不对的,实际上这三个字节如果按

生成不带BOM头的UTF-8文件

UTF-8(带BOM):writer = New StreamWriter(FilePathName, True, System.Text.UTF8Encoding.UTF8) UTF-8(不带BOM):writer =New StreamWriter(FilePathName, True, New UTF8Encoding(False)) 生成不带BOM头的UTF-8文件,布布扣,bubuko.com

C#写UTF8文件时指定是否含BOM头

BOM的基本概念 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中.UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE".这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的:如果收到FFFE,就表明这个字节流是Little-Endian的.因此字符"ZERO WIDTH N

PHP 下载文件时自动添加bom头的方法

首先弄清楚,什么是bom头?在Windows下用记事本之类的程序将文本文件保存为UTF-8格式时,记事本会在文件头前面加上几个不可见的字符(EF BB BF),就是所谓的BOM(Byte order Mark).不仅限于 记事本保存的文件,只要在文件的开口包含了EF BB BF 几个不可见的字符(十六进制应该是是xEFxBBxBF,用二进制编辑文件可见).这像是一个约定俗成的东西,当系统看到这玩意的时候,就会觉得你这个文件是UTF-8编码的. 如果你的接口是UTF-8的,你需要强制下载一个文件,

Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50

Linux下查找包含BOM头的文件和清除BOM头命令 2014-08-16 12:30:50 分类: 系统运维 查找包含BOM头的文件,命令如下: 点击(此处)折叠或打开 grep -r -I -l $'^\xEF\xBB\xBF' ./ \xef\xbb\xbf是UTF8 BOM的16进制表示 这个命令会把当前目录及所有子目录下的BOM头删除掉. 点击(此处)折叠或打开 find . -type f -exec sed -i 's/\xEF\xBB\xBF//' {} \; 另一种方法: 点击