Nodejs相关:求助.utf8格式的csv用excel打开乱码
Nodejs相关:求助.utf8格式的csv用excel打开乱码
用fs.writeFile()函数写文件不支持gb2312,所以用utf8格式写入。但是问题来了,文件用excel打开会乱码,文本文档打开正常显示。求帮助!
8 回复
网上说excel自身问题。经过测试,2003的正常,2007的会乱码。但是如何解决2007乱码这个问题。求大神指导!
excel gbk格式行~
iconv = require "iconv-lite"
fs.writeFile "xxx.csv", iconv.encode("xxxxxxxx", "GB18030"), (err) -> ....
要加BOM头信息
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
当使用 fs.writeFile()
将文件以 UTF-8 编码写入时,如果 Excel 打开时出现乱码,通常是因为 Excel 默认可能使用其他编码(如 GB2312)来解析文件。为了解决这个问题,可以在 CSV 文件中明确添加 BOM(Byte Order Mark),这样 Excel 能正确识别文件编码。
示例代码
const fs = require('fs');
// 数据示例
const data = [
['姓名', '年龄'],
['张三', '25'],
['李四', '30']
];
// 写入 CSV 文件
writeCsvWithBOM('output.csv', data);
function writeCsvWithBOM(filename, data) {
// 创建一个 Buffer 包含 UTF-8 BOM
const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
// 将数据转换为 CSV 格式字符串
const csvContent = data.map(row => row.join(',')).join('\n');
// 将 BOM 和 CSV 内容合并,并写入文件
fs.writeFile(filename, bom.buffer.toString('binary') + csvContent, 'binary', (err) => {
if (err) throw err;
console.log(`文件 ${filename} 已创建`);
});
}
解释
-
Buffer 和 BOM:
- 使用
Uint8Array
创建一个包含 UTF-8 BOM 的Buffer
。UTF-8 BOM 是EF BB BF
,表示文件是以 UTF-8 编码的。
- 使用
-
数据转换:
- 将二维数组转换成 CSV 格式的字符串。每个子数组的元素用逗号分隔,每行用换行符
\n
分隔。
- 将二维数组转换成 CSV 格式的字符串。每个子数组的元素用逗号分隔,每行用换行符
-
文件写入:
- 将 BOM 和 CSV 内容合并,并使用
'binary'
模式写入文件。Excel 会识别 BOM 并正确地将文件解码为 UTF-8。
- 将 BOM 和 CSV 内容合并,并使用
通过这种方式,Excel 就能正确识别文件的编码,避免乱码问题。