Nodejs相关:求助.utf8格式的csv用excel打开乱码

Nodejs相关:求助.utf8格式的csv用excel打开乱码

用fs.writeFile()函数写文件不支持gb2312,所以用utf8格式写入。但是问题来了,文件用excel打开会乱码,文本文档打开正常显示。求帮助!

8 回复

Node.js 相关:求助 - UTF-8 格式的 CSV 文件用 Excel 打开乱码

问题描述

使用 fs.writeFile() 函数将数据以 UTF-8 编码写入 CSV 文件时,文件在文本编辑器中可以正确显示,但在 Excel 中打开时却出现了乱码。

原因分析

问题的根本原因在于 Excel 默认可能以 ANSI 或 GBK 等编码方式来解析 CSV 文件。当文件以 UTF-8 编码保存时,Excel 无法正确识别这种编码,从而导致乱码现象。

解决方案

为了解决这个问题,我们需要在导出 CSV 文件时添加 BOM(Byte Order Mark),BOM 是一种特殊字符,用于指示文件采用的编码方式。Excel 能够识别带有 BOM 的 UTF-8 文件,并正确解析其内容。

以下是实现该解决方案的示例代码:

const fs = require('fs');

// 示例数据
const data = [
    ['姓名', '年龄'],
    ['张三', '25'],
    ['李四', '30']
];

// 将数据转换为 CSV 格式
const csvData = data.map(row => row.join(',')).join('\n');

// 添加 UTF-8 BOM
const bom = '\uFEFF';

// 使用 fs.writeFile 写入文件
fs.writeFile('example.csv', bom + csvData, 'utf8', (err) => {
    if (err) {
        console.error('写入文件时发生错误:', err);
    } else {
        console.log('CSV 文件已成功写入');
    }
});

代码解释

  1. 数据准备:定义一个二维数组 data,包含 CSV 文件中的行和列。
  2. 数据转换:将数据转换成 CSV 格式字符串。map 方法遍历每一行,join(',') 方法将每个单元格连接成一行,并用换行符 \n 分隔多行。
  3. 添加 BOM:在写入文件之前,在 CSV 数据前添加 UTF-8 BOM 字符 \uFEFF
  4. 写入文件:使用 fs.writeFile 将带 BOM 的 CSV 数据写入到文件 example.csv 中。

通过上述方法,你可以确保 CSV 文件在 Excel 中也能正确显示。希望这个解决方案能帮到你!


网上说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} 已创建`);
    });
}

解释

  1. Buffer 和 BOM:

    • 使用 Uint8Array 创建一个包含 UTF-8 BOM 的 Buffer。UTF-8 BOM 是 EF BB BF,表示文件是以 UTF-8 编码的。
  2. 数据转换:

    • 将二维数组转换成 CSV 格式的字符串。每个子数组的元素用逗号分隔,每行用换行符 \n 分隔。
  3. 文件写入:

    • 将 BOM 和 CSV 内容合并,并使用 'binary' 模式写入文件。Excel 会识别 BOM 并正确地将文件解码为 UTF-8。

通过这种方式,Excel 就能正确识别文件的编码,避免乱码问题。

回到顶部