我要将用户查询的结果信息保存到csv或者execl(由于没有找到合适的execl库,所以采用csv库保存)中, 结果用execl打开csv文件发现乱码,通过google找到iconv-lite,可结果还是不行 。代码如下: fs.open(config.UP_PATH+’/csv/’+troopId+year+month+’.csv’,’a’); var csvData = ‘"序号","检查人","检查日期","省","城市","系统","售点","地址","门店类型",’+shopnames; var b = Iconv.encode(csvData,’GBK’); csv().from.string(b).to(config.UP_PATH+"/csv/"+troopId+year+month+’.csv’);
shopnames:是一个中文字符串变量
用csv处理汉字没有问题:
var csv = require('csv');
var data = [
['john', 23, '城市'],
['john2', 123, 'male'],
['john3', 234, 'female']
];
csv()
.from.array(data)
.to.path('sample2.csv');
$ cat sample2.csv
john,23,城市
john2,123,male
john3,234,female
http://www.csser.com/question/505ae0066f1f5a9d610004dd 由于node.js 只支持‘ascii’ 、’utf8’、’base64’、’binary’ 编码方式,不支持MS 的 utf-8 + BOM 格式。所以 excel 打开中文乱码。
我是这么解决的:nodejs 生成的 csv 文件先用 Open Office 或 Libre Office 打开,存成 Office Excel 格式。这样就可以用 Excel 打开,中文没有乱码。
@zjshop 根据 @leapon 的回复,解决方法已经很明显了,既然excel需要BOM,每次写入数据前先加入一个BOM就可以了嘛。utf-8对应的BOM是 EF BB BF
,稍微改动下1楼代码:
var csv = require('csv'),fs=require('fs');
var data = [
['john', 23, '城市'],
['john2', 123, 'male'],
['john3', 234, 'female']
];
var fout=fs.createWriteStream('sample2.csv');
fout.write(new Buffer('\xEF\xBB\xBF','binary'));//add utf-8 bom
csv() .from.array(data) .to(fout);
如此,excel直接打开文件也不会乱码了,转码GBK是不需要的,保持本身utf-8即可。
@shiedman 还是会乱码的呀;代码如下: var csvData = ‘"序号","检查人","检查日期","省","城市","系统","售点","地址","门店类型"’; csvData = csvData.split(‘,’); var fout=fs.createWriteStream(config.UP_PATH+’/csv/aaa.csv’); fout.write(new Buffer(‘\xEF\xBB\xBF’,’binary’)); csv().from.array(csvData ).to(fout); excel打开如下:
@zjshop 搴忓彿
的GBK字节=序号
的utf8字节,excel把cvs文件当gbk来处理了,也就是说很大的可能,BOMEFBB BF
并没有加上去,请检查文件的头3个字节是什么。
附上我机子上的运行结果:excel 2003,生成文件大小87字节,头3字节EF BB BF
http://i.imgur.com/IPZfUKo.png
@shiedman EF BB BF 6A 6F 68 6E 2C 32 33 2C E5 9F 8E E5 B8 82 0A 6A 6F 68 6E 32 2C 31 32 33 2C 6D 61 6C 65 0A 6A 6F 68 6E 33 2C 32 33 34 2C 66 65 6D 61 6C 65
@紫胤: 一个内部的终极解决方案
nodejs文件下载服务
踩到的几个坑:
1.Excel2007 打开utf-8编码的csv文件默认乱码
相关信息:http://www.docin.com/p-31710590.html
2.文件名中含中文,下载会乱码。各浏览器表现不同
相关信息:http://www.phpv.net/html/1675.html
解决方法:
iconv转码,utf-8 -> gbk
转完后为buffer对象,内容直接res.end(buffer), header中的filename则由buffer.toString(‘binary’);
var http = require('http');
var url = require('url');
var Iconv = require('iconv').Iconv;
var crypto = require('crypto');
var server = http.createServer(function(req, res){
var path = url.parse(req.url).pathname;
if(path == '/favicon.ico'){
res.end('');
}else{
var filename = '2012-06-01 至 2012-06-01 数据报表.csv';
var content = "序号,日期,成交商品数,客单价,关注次数,搜索次数,收藏人数\n1, 2012-06-01, 1, 1, 1, 1, 1\n1, 2012-06-02, 1, 1, 1, 1, 1";
//excel2007默认不支持utf-8编码的csv文件
var iconv = new Iconv('UTF-8', 'GBK//IGNORE');
content = iconv.convert(content);
res.setHeader('Pragma', 'public');
res.setHeader('Expires', '0');
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');
// res.setHeader('Cache-Control', 'pre-check=0, post-check=0, max-age=0');
// res.setHeader('Content-Transfer-Encoding', 'none');
res.setHeader('Content-Type', 'text/csv; charset=GBK');
filename = iconv.convert(filename).toString('binary');
res.setHeader('Content-Disposition', 'attachment;filename="'+ filename +'"');
res.setHeader('Content-Length', content.length);
res.end(content);
}
}).listen(22222);