如何将 Chinese/Korean 个单词导出到 csv

How to export Chinese/Korean words to csv

我设法将英文文本导出到 csv 文件并实现了本地化。拉丁字母和单词适用于任何语言(例如:德语),但我的程序无法将 Chinese/Korean 单词导出到 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 文件。

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

Excel 使用它来确定打开 CSV 文件时的编码(例如通过双击)。如果没有BOM,则使用locale 8-bit编码(大概是cp1252)。

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

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

回读文件时你将不得不处理它