You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言读取Excel导出的UTF-8 CSV文件遇开头特殊字符问题求助

解决Excel导出UTF-8 CSV文件开头的BOM干扰问题

嘿,我之前也踩过这个一模一样的坑!你遇到的239、187、191这三个字符,其实是UTF-8字节顺序标记(BOM),对应的十六进制是0xEF 0xBB 0xBF。Excel在导出「CSV UTF-8 (逗号分隔)(*.csv)」格式时,默认会在文件开头插入这个BOM——它的作用是让部分编辑器或工具快速识别文件是UTF-8编码,但对于没做特殊处理的C语言读取程序来说,这三个额外的字节会直接打乱你原本的文本解析逻辑,导致程序出现异常。

给你两个实用的解决思路:

1. 在C语言读取逻辑中主动跳过BOM

这是最直接的代码层解决方案,在读取正文内容前先检查文件开头的三个字节,如果是BOM就跳过它们。这里给你一段可参考的示例代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp = fopen("your_file.csv", "rb");
    if (!fp) {
        perror("Failed to open file");
        return EXIT_FAILURE;
    }

    // 检查并跳过UTF-8 BOM
    unsigned char bom[3];
    size_t read_bytes = fread(bom, sizeof(unsigned char), 3, fp);
    if (read_bytes == 3) {
        if (!(bom[0] == 0xEF && bom[1] == 0xBB && bom[2] == 0xBF)) {
            // 不是BOM的话,把文件指针移回开头
            fseek(fp, 0, SEEK_SET);
        }
        // 是BOM的话,指针已经在三个字节之后,直接读取正文即可
    } else if (read_bytes > 0) {
        // 文件内容不足3字节,移回开头继续处理
        fseek(fp, 0, SEEK_SET);
    }

    // 接下来正常处理CSV内容,比如逐行读取解析
    char line_buf[1024];
    while (fgets(line_buf, sizeof(line_buf), fp)) {
        // 这里写入你的业务逻辑,比如拆分CSV字段
        printf("%s", line_buf);
    }

    fclose(fp);
    return EXIT_SUCCESS;
}

2. 手动去除文件中的BOM(可选)

如果你不想在代码里额外处理BOM,可以用文本工具修改文件编码:

  • 用Notepad++打开Excel导出的CSV文件
  • 点击顶部菜单栏的「编码」→「转为UTF-8无BOM编码格式」
  • 保存文件后,文件开头的三个干扰字节就会被移除

补充一句:UTF-8本身其实不需要BOM(它是单字节编码,不存在字节顺序问题),但Windows生态下的很多工具(比如Excel)为了兼容旧的编码识别逻辑,会默认加上BOM,这也是为什么在Unix/Linux环境下的工具里很少遇到这个问题。

内容的提问来源于stack exchange,提问作者Jiminion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:24