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
相关产品推荐
相关产品推荐

