c++ - 如何将中文/韩文单词导出到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 文件,而不需要任何额外的步骤。
解决方案
Microsoft 产品因在 UTF-8 中使用BOM而臭名昭著(最初在 Unicode 规范中是无效的,但由于在实践中广泛使用,现在允许,但不推荐)。
Excel 在您打开 CSV 时使用它来确定它们的编码(例如通过双击)。如果没有 BOM,则使用区域设置 8 位编码(可能是 cp1252)。
要强制它读取为 UTF-8,请编写一个 BOM,如下所示:
ofstream file(filename);
file << char(0xEF) << char(0xBB) << char(0xBF);
回读文件时,您将不得不处理它
推荐阅读
- sqlconnection - 无法使用 java 的 SqlConnection 将数据插入 sql db
- c++ - arduino 看似 0 != 0
- javascript - 在 Rollup.js 中使用 jQuery DataTables
- ruby-on-rails - ActiveRecord cache_key 不会更改包含的表
- python-3.x - 如何在二维列表中搜索单个单词?
- r - 尽管在 RStudio 中工作,但 blogdown 未在 Netlify 中呈现
- javascript - 如果数组为空而不是使用带有箭头函数的 .find 方法未定义,如何返回“null”?
- python - 如何将此 Python for 循环转换为 Tensorflow(如果可能)
- vhdl - 从 VHDL 中的字节 x 字节乘法中选择一个字节
- typescript - 为数组创建自定义类型