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

参考

总结

到此这篇关于Node.js文本文件BOM头去除的文章就介绍到这了,更多相关Node.js文本文件BOM头去除内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-11-20

Node.js实现批量去除BOM文件头

之前的同事写了一个工具,但有bug,就是在替换文件后原文件的格式变成utf8 BOM了,这种带BOM的XML在Mac下可能读取不出来,所以就需要写个工具处理一下. 其实思路比较简单,首先遍历目录,然后读取目录,将文件头三个字节去除掉,然后保存为utf-8格式的文件即可,直接上代码吧 :) 复制代码 代码如下: var fs = require('fs'); var path = "目标路径.."; function readDirectory(dirPath) {     if (fs

PHP批量去除BOM头内容信息代码

什么是bom头? 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码,现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑utf-8编码后执行就会出错的原因了. 批量去除bom头代码如下所示: <?php if (isset($_GET['dir'])){ //设置文件目录 $basedir=$_GET['dir']; }else{ $basedir = '.'; } $auto = 1; checkdi

Node.js实现批量下载图片简单操作示例

本文实例讲述了Node.js实现批量下载图片简单操作.分享给大家供大家参考,具体如下: 使用Node.js批量下载图片 首先要获取到图片链接: const img = [ "http://yw-yx.oss-cn-hangzhou.aliyuncs.com/ywwl-jylesson/2019/08/52218400506629423.jpg", "http://yw-yx.oss-cn-hangzhou.aliyuncs.com/ywwl-jylesson/2019/08/

PHP批量去除BOM头代码分享

<?php /** * 去除bom头信息 */ header("Content-Type:text/html; charset=utf-8"); $auto = 1; checkdir("D:\wamp\www\sales"); function checkdir($basedir){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '

node.js require() 源码解读

2009年,Node.js 项目诞生,所有模块一律为 CommonJS 格式. 时至今日,Node.js 的模块仓库 npmjs.com ,已经存放了15万个模块,其中绝大部分都是 CommonJS 格式. 这种格式的核心就是 require 语句,模块通过它加载.学习 Node.js ,必学如何使用 require 语句.本文通过源码分析,详细介绍 require 语句的内部运行机制,帮你理解 Node.js 的模块机制. 一.require() 的基本用法 分析源码之前,先介绍 requir

基于 Node.js 实现前后端分离

基本介绍 首先从一个重要的概念"模板"说起. 广义上来说,web中的模板就是填充数据后可以生成文件的页面. 严格意义上来说,应该是模板引擎利用特定格式的文件和所提供的数据编译生成页面.模板大致分为前端模板(如ejs)和后端模板(如freemarker)分别在浏览器端和服务器端编译. 由于当场有一部分同学对node.js并不是很了解,这里补充一下node.js的相关知识.官网上的给他的定义事件驱动.异步什么的就不说了.这里借用朴灵书上的一张图来解释一下node.js这个玩意的结构.如果懂

简单谈谈PHP vs Node.js

网络正在处于一个日新月异的发展时代.服务器端开发人员在选择语言的时候非常困惑,有长期占主导地位的语言,例如C.Java和Perl,也有专注于web开发的语言,例如Ruby.Clojure和Go.只要你的项目运行良好,你的选择就显得没有那么重要了. 但是如何让这些新的web开发人员做出一个正确的选择呢? 我不希望展开一场PHP.NodeJs两大阵营之间的战争,我将会对比这两种语言所在领域的发展状况: PHP Rasmus Lerdorf在1994年创造出了PHP.它是由安装在web服务器(Apac

node.js 一个简单的页面输出实现代码

安装过程就不说了.如果成功是能使用node的命令.node.js调试是非常方便的.每种后台语言都有一个向那个黑黢黢的控制台团输出语用的命令.node.js沿用FF那套东西,也就是console对象与其方法.我们首先建一个example.js文件,内容如下,然后在控制台打开它. 复制代码 代码如下: console.log("hello node.js") for(var i in console){ console.log(i+" "+console[i]) } n

Node.js下向MySQL数据库插入批量数据的方法

项目(nodejs)中需要一次性插入多笔数据到数据库,数据库是mysql的,由于循环插入的性能太差,就像使用批量插入的方法提高数据的插入性能. 批量插入的数据库的表结构如下: 1.数据库连接 var mysql = require('mysql'); // 数据库信息 var connection = mysql.createConnection({ host : 'localhost', user : '数据库用户名', password : '数据库登录密码', database : '操作

批量去除PHP文件中bom的PHP代码

需要去除BOM,就把附件里的tool.php文件放到目标目录,然后在浏览器访问tool.php即可! 复制代码 代码如下: <?php //此文件用于快速测试UTF8编码的文件是不是加了BOM,并可自动移除 $basedir="."; //修改此行为需要检测的目录,点表示当前目录 $auto=1; //是否自动移除发现的BOM信息.1为是,0为否. //以下不用改动 if ($dh = opendir($basedir)) { while (($file = readdir($d