在Excel(CSV文件)中写入和显示波斯语数据的问题
波斯语写入CSV后Excel乱码的原因及修复方案
核心原因
- 缺少UTF-8 BOM标识:Excel默认打开CSV时,若文件无BOM,会采用系统默认编码(如Windows下的GBK)解析内容。波斯语的UTF-8字节被错误解码为其他编码,就会出现乱码。
- WideCharToMultiByte参数错误:如果调用时未指定
CP_UTF8代码页,或未正确计算转换所需字节数,会导致字符转换不完整或错误。
修复步骤
1. 写入UTF-8 BOM
在写入任何数据前,先向文件写入UTF-8的BOM字节序列0xEF, 0xBB, 0xBF,明确告诉Excel文件编码为UTF-8:
ofstream outFile("output.csv", ios::binary | ios::out); // 写入UTF-8 BOM unsigned char utf8Bom[] = {0xEF, 0xBB, 0xBF}; outFile.write(reinterpret_cast<char*>(utf8Bom), sizeof(utf8Bom));
2. 正确执行宽字符到UTF-8的转换
确保WideCharToMultiByte使用正确的参数,完整转换波斯语字符串:
CString persianName = _T("عباس"); // 第一步:计算转换所需的UTF-8字节数 int utf8ByteCount = WideCharToMultiByte( CP_UTF8, // 目标编码为UTF-8 0, // 无特殊转换标志 persianName, // 待转换的宽字符串 -1, // 自动处理字符串末尾的'\0' nullptr, // 临时缓冲区为null,仅计算长度 0, nullptr, nullptr ); if (utf8ByteCount > 0) { char* utf8Buffer = new char[utf8ByteCount]; // 第二步:执行转换 WideCharToMultiByte( CP_UTF8, 0, persianName, -1, utf8Buffer, utf8ByteCount, nullptr, nullptr ); // 写入文件(去掉末尾的'\0') outFile.write(utf8Buffer, utf8ByteCount - 1); delete[] utf8Buffer; }
注意:必须用ios::binary模式打开文件,避免文本模式下的换行符自动转换破坏UTF-8字节流。
3. 验证修复效果
用Notepad++打开生成的CSV文件,查看编码是否为「UTF-8 带BOM」,确认后再用Excel打开,波斯语内容就能正常显示。
内容的提问来源于stack exchange,提问作者Abbas
相关产品推荐
相关产品推荐

