首页 > 解决方案 > 如何将中文/韩文单词导出到csv

问题描述

我设法将英文文本导出到 csv 文件并实现本地化。拉丁字母和单词适用于任何语言(例如:德语),但我的程序无法将中文/韩语单词导出到 csv,而是显示奇怪的字符:

非英文文本是什么样的

作为参考,英文版如下所示:

预期输出

这是我用来生成文件的代码:

ofstream file(filename);
// file.imbue(locale(file.getloc(), new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>()));
file << outputListWaveform << "\n";

//this is the part get the header of each column
for (int x = 0; x < data.size(); ++x)
{
    file << get<0>(data.at(x));
    if (x != data.size() - 1)
        file << ",";
}
file << "\n";

for (int i = 0; i < get<1>(data.at(0)).size(); ++i)
{
    for (int j = 0; j < data.size(); ++j)
    {
        auto header = get<0>(data.at(j));
        auto dVal = get<1>(data.at(j));
        auto bVal = get<2>(data.at(j));

        file << ((header == FileOpConstants::BOST || header == FileOpConstants::EOST) ? bVal.at(i) : dVal.at(i));
        if (j != data.size() - 1)
            file << ",";
    }
    file << "\n";
}

file.close();

这里是导入 CSV 文件的代码

 StepTable data;
    ifstream file(filename);

    if (!file.is_open())
    {
        string errMsg = "Could not open file: " + filename;
        throw runtime_error(errMsg);
    }

    string line, colname;
    if (file.good())
    {
        getline(file, line); // metadata (e.g. "Output List Waveform" as generated using Cyclops)
        getline(file, line); // column header
        stringstream ss(line);
        while (getline(ss, colname, ','))
        {
            data.push_back({colname, vector<double>{}, vector<bool>{}});
        }
    }

    // Get Column Values (row by row)
    while (getline(file, line))
    {
        int i = 0;
        auto val = Utility::split(line, ',');
        for (const auto& v : val)
        {
            auto header = get<0>(data.at(i));
            if (header == FileOpConstants::BOST || header == FileOpConstants::EOST)
            {
                get<2>(data.at(i)).push_back(stoi(v));
            }
            else if(header == VoltageHeader || header == CurrentHeader || header == PowerHeader || header == ResistanceHeader || header == TimeHeader )
            {
                get<1>(data.at(i)).push_back(stod(v));
            }
            else{
                return {};
            }
            i++;
        }
    }

    file.close();
    return data;

我在导出的 CSV 文件上尝试了这种方法(https://www.itg.ias.edu/content/how-import-csv-file-uses-utf-8-character-encoding-0),它看起来像这样:

在此处输入图像描述

我能够毫无错误地导出和导入中文 CSV 文件。但是我想用正确的中文单词查看导出的 CSV 文件,而不需要任何额外的步骤。

标签: c++export-to-csvofstreamexport-csv

解决方案


Microsoft 产品因在 UTF-8 中使用BOM而臭名昭著(最初在 Unicode 规范中是无效的,但由于在实践中广泛使用,现在允许,但不推荐)。

Excel 在您打开 CSV 时使用它来确定它们的编码(例如通过双击)。如果没有 BOM,则使用区域设置 8 位编码(可能是 cp1252)。

要强制它读取为 UTF-8,请编写一个 BOM,如下所示:

ofstream file(filename);
file << char(0xEF) << char(0xBB) << char(0xBF);

回读文件时,您将不得不处理它


推荐阅读