我从mysql数据库中读取数据,然后将其保存到csv文件中。我检查了服务器端,文件是用utf8格式正确保存的。 然后提示用户下载文件。当我在我的计算机(MacOSX)上下载文件时,使用utf8文件是正确的。 (在Termninal中使用file命令)
当我在Excel中打开csv文件时,重音字符是错误的。 在Excel中,如果我用文本编辑器打开文件,我会使用AZERTY√©而不是AZERTYéa。
这是我的代码:
// File creation
var reportFile = Date.now();
fs.closeSync(fs.openSync(__dirname + '/reports/' + reportFile + '.csv', 'w'));
var attributes = [];
var row = [];
fs.appendFileSync(__dirname + '/reports/' + reportFile + '.csv', "\ufeff");
for(var x = 0; x<fields.length; x++) attributes.push(fields[x].name);
fs.appendFile(__dirname + '/reports/' + reportFile + '.csv', attributes.join('|'), function (err) {
if(err) console.log('Error appending fields', err);
fs.appendFileSync(__dirname + '/reports/' + reportFile + '.csv', '\n');
for(var x = 0; x<results.length; x++) {
row = [];
for(var y = 0; y<attributes.length; y++){
row.push(results[x][attributes[y]]);
}
fs.appendFileSync(__dirname + '/reports/' + reportFile + '.csv', row.join('|'));
fs.appendFileSync(__dirname + '/reports/' + reportFile + '.csv', '\n');
}
// file download
req.reportFile = reportFile;
res.setHeader('Content-disposition', 'attachment; filename='+__dirname + '/reports/' + reportFile + '.csv');
res.set('Content-Type', 'text/csv; charset=utf-8');
fs.readFile(__dirname + '/reports/' + reportFile + '.csv', 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
console.log(data);
res.header("Access-Control-Allow-Origin", "*");
res.status(200).send(data);
});
});
答案 0 :(得分:1)
我终于找到了解决方案。发送文件时出现BOM问题。我认为它已经设置,因为我在编写文件时设置它....
我改变了这一行
res.status(200).send(data);
到
res.status(200).send('\ufeff'+data);