看到标题,有很多童鞋可能会有疑惑,html文件,不就是能在浏览器运行的文件吗?是的,相信大家也注意到了,html文件是有编码格式的,我们写html文件代码,默认格式是utf-8格式,如果是GBK格式的html能否正常显示呢?大家不妨亲自试试。
背景
- 需求:处理GBK格式的html文件,让其正常在浏览器进行展示。
- 问题:利用WPS在进行doc转html结果,转出来的html文件格式有两种,一种是GBK格式,另外一种utf8格式,GBK格式的html文件在浏览器的展示时候,可能会出现乱码的情况
- 解决方式:通过老外写的一个JS开源库:iconv-lite,对GBK文件进行批量处理
一、GBK编码文件处理说明
iconv需要依赖native库,这样一来,在一些不支持native模块安装的虚拟主机和windows平台上,我们还是无法安心处理GBK编码。
老外写了一个通过纯Javascript转换编码的模块 iconv-lite
可以实现window下的转换 ,通过npm可以安装此模块,bufferhelper是一个操作buffer的加强类
首先安装
npm install iconv-lite
npm install bufferhelper
1)例子:后端进行转换
var http = require('http'),
var url = require('url').parse('http://www.9958.pw/');
var iconv = require('iconv-lite');
var BufferHelper = require('bufferhelper');
http.get(url,function(res){
var bufferHelper = new BufferHelper();
res.on('data', function (chunk) {
bufferHelper.concat(chunk);
});
res.on('end',function(){
console.log(iconv.decode(bufferHelper.toBuffer(),'GBK'));
});
})
二、具体实例案例
需求分析:
- 1、输入一个地址,循环读取文件功能
- 2、修改html文件的头,改成utf-8并保存
- 3、读取GBK格式文件内容,并转换进行保存为UTF-8格式
实现原理:
- 1、利用node.js,fs库的读取、修改、保存等功能
- 2、利用iconv-lite 库,进行GBK转换成utf-8
具体实现代码:
const path = require('path');
const fs = require('fs');
var iconv = require('iconv-lite');
var BufferHelper = require('bufferhelper');
let index = 0;
// 进行utf8 表头修改
function changeType(type, filePath) {
fs.readFile(
path.resolve(__dirname, filePath),
type,
// 'utf8',
(error, data) => {
if (error) {
console.error('read colover.xml fail');
} else {
if (!data) {
reject('更新文件下载失败,请联系管理员');
} else {
let a = null;
if (type === 'utf8') { // 替换gb2312成 utf-8
a = replaceGbk(data);
} else { // 对文件进行处理,转换成utf8格式的文件
a = gbkToutf8(data)
}
fs.writeFile(path.resolve(__dirname, filePath), a, (error)=>{
console.log(error)
});
}
}
}
);
}
// gbkToutf8核心转换
function gbkToutf8(data) {
index += 1;
console.log(index)
var bufferHelper = new BufferHelper();
bufferHelper.concat(data);
const a = iconv.decode(bufferHelper.toBuffer(),'GBK')
return a;
}
function replaceGbk(str) {
index += 1;
console.log(index)
return str.replace('gb2312', 'utf-8')
}
// 获取具体的文件
function readFileList(dir) {
const files = fs.readdirSync(dir);
files.forEach((item, index) => {
var fullPath = path.join(dir, item);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
readFileList(path.join(dir, item)); //递归读取文件
} else {
// if (item === 'package.json') {
if (item.indexOf('.html') > -1) {
console.log(item);
changeType('utf8', fullPath);
}
// var content = fs.readFileSync(fullPath, 'utf-8');
// let uploadData = { license: '' };
// if (content) {
// uploadData = JSON.parse(content);
// }
// if (uploadData.license === 'GPL') {
// console.log(uploadData.license)
// }
// filesList.push(uploadData.license);
// }
}
});
}
// 启动执行
readFileList('../allFile');