【问题标题】:How to save a CSV file as UTF-8如何将 CSV 文件保存为 UTF-8
【发布时间】:2014-02-11 20:47:18
【问题描述】:

我编写代码来创建 .带有泰语字符的 CSV 文件。但是当我在该文件中使用 Microsoft Excel 泰语字符打开一个文件时出现错误。但是当我在记事本中打开它时,然后按保存。并再次在 Excel 中打开它。我认为这是理想的,因为程序没有编码为 utf-8。 我只好做Program,保存为utf-8。

std:: ofstream MyCSVFile;
MyCSVFile.open("myfile.csv", std::ios::out | std::ios::app);
MyCSVFile << "Name,Address" << endl;
MyCSVFile <<name<<","<<address << endl;
MyCSVFile.close();
}

【问题讨论】:

  • 真正的问题是什么?
  • 如果您将数据存储在 UTF8 中的名称和地址中,我认为它们会被这样写出来。 (C++ 和&lt;&lt; 只是写出字节,并不特别关心编码。)这只是将问题转移到确保您的原始数据采用您想要的编码,我猜。

标签: c++ csv utf-8 mfc


【解决方案1】:

您需要执行以下操作(假设文件路径存储在FilePath): 这是您应该使用的代码:

const std::wstring fileStr(FilePath);
wofstream mFile(FilePath);


mFile.imbue(std::locale(std::locale::empty(), new std::codecvt_utf8<wchar_t>));
if (mFile.is_open())
{
    const wchar_t *bom = L"\xef\xbb\xbf";
    mFile << bom;
...

现在您可以编写文本,当然也可以关闭文件。

【讨论】:

    【解决方案2】:

    您需要将 BOM 写入文件的开头。试试这个:

    const char *bom = "\xef\xbb\xbf";
    MyCSVFile << bom;
    MyCSVFile << "Name...
    

    这是一本好书:BOM in Wikipedia

    【讨论】:

    • 是否需要 BOM 标记?
    • 我也不喜欢这种技术,因为在打开要读取的文件时需要读取 BOM 标记。在 C++ 中是否没有一种技术可以让文件流自动执行此操作(即流可以包含的一些本地对象)。
    • 我还要注意他正在附加到文件中。 BOM 标记可能不适合这种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    相关资源
    最近更新 更多