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

在Excel(CSV文件)中写入和显示波斯语数据的问题

波斯语写入CSV后Excel乱码的原因及修复方案

核心原因

  1. 缺少UTF-8 BOM标识:Excel默认打开CSV时,若文件无BOM,会采用系统默认编码(如Windows下的GBK)解析内容。波斯语的UTF-8字节被错误解码为其他编码,就会出现乱码。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:26