如何用C语言向CSV文件写入UTF-8字符并解决列显示异常问题
解决C语言写入CSV的两个问题:UTF-8字符输出与单元格合并
一、解决所有数据写入单个单元格的问题
你的代码逻辑本身没问题,出现单元格合并通常是以下原因导致:
系统CSV分隔符不匹配
很多地区(如土耳其、欧洲部分国家)的系统默认用分号(;)作为CSV列分隔符,而非逗号(,)。若你的电脑区域设置如此,Excel或表格软件会把逗号当成普通文本,将所有内容塞进一个单元格。
解决方法:把代码中的逗号替换为分号:fprintf(file, "Ad; Soyad; Yaş\n"); fprintf(file, "John; Doe; 30\n"); fprintf(file, "Jane; Smith; 25\n");缺少UTF-8 BOM头
旧版Excel等软件无法自动识别无BOM的UTF-8 CSV文件,会导致解析异常。可在文件开头写入UTF-8 BOM(三个字节:0xEF, 0xBB, 0xBF):// 写入其他内容前先输出BOM fputs("\xef\xbb\xbf", file);换行符不兼容Windows系统
Windows下文本文件的标准换行是\r\n,若代码仅用\n,部分软件可能无法正确识别换行,导致内容堆叠。可将换行符改为\r\n:fprintf(file, "Ad, Soyad, Yaş\r\n");
二、写入UTF-8字符(如Ş、Ğ、İ)
C语言处理UTF-8字符很直接,只需满足两个核心条件:
源代码保存为UTF-8编码
你的.c文件必须以UTF-8编码保存(带不带BOM均可),确保编译器能正确识别Ş、Ğ、İ这些字符的UTF-8字节序列。避免系统编码干扰
最稳妥的方式是用二进制模式打开文件,防止系统自动转换换行符或编码:FILE *file = fopen("veriler.csv", "wb");若用二进制模式,需手动适配不同系统的换行符,可通过宏定义实现:
#ifdef _WIN32 #define NEWLINE "\r\n" #else #define NEWLINE "\n" #endif完整示例代码:
#include <stdio.h> #ifdef _WIN32 #define NEWLINE "\r\n" #else #define NEWLINE "\n" #endif int main() { FILE *file = fopen("veriler.csv", "wb"); if (file == NULL) { printf("Dosya açma hatası!\n"); return 1; } // 写入UTF-8 BOM适配旧版Excel fputs("\xef\xbb\xbf", file); // 写入普通数据行 fprintf(file, "Ad, Soyad, Yaş%s", NEWLINE); fprintf(file, "John, Doe, 30%s", NEWLINE); fprintf(file, "Jane, Smith, 25%s", NEWLINE); // 写入带UTF-8特殊字符的行 fprintf(file, "Mehmet, Kaya, 28%s", NEWLINE); fprintf(file, "Ayşe, Şahin, 24%s", NEWLINE); fprintf(file, "Mustafa, Ğök, 32%s", NEWLINE); fclose(file); printf("CSV dosyası oluşturuldu.\n"); return 0; }
额外提示
- 新版Excel或LibreOffice只需逗号分隔+带BOM的UTF-8编码,就能正常显示列和特殊字符。
- 测试时可先用文本编辑器打开CSV文件,确认分隔符和特殊字符是否正确,再用表格软件打开。
内容的提问来源于stack exchange,提问作者muratkavak
相关产品推荐
相关产品推荐

