多平台方式将std :: wstring写入C ++文件中

时间:2016-05-23 15:51:25

标签: c++ encoding character-encoding

我一直在努力做一些看似简单的事情:将内容写入std :: wstring到磁盘。假设我有以下要写入纯文本文件的字符串:

std::wstring s = L"输入法."; // random characters pulled from baidu.cn
  1. 使用std::codecvt_utf8或提升语言区域
  2. 以下是我使用的代码:

    std::wofstream out(destination.wstring(), std::ios_base::out | std::ios_base::app);
    const std::locale utf8_locale = std::locale(std::locale(), new boost::locale::utf8_codecvt<wchar_t>());
    out.imbue(utf8_locale);
    // Verify that the file opened correctly
    out << s << std::endl;
    

    这在Windows上工作正常,但遗憾的是我在Linux上编译它:codecvt_utf8尚未在通常发行版提供的编译器上可用,而Boost:Locale仅包含在Boost 1.60.0中再次是一个版本,对于发行版的存储库来说太新了。如果不设置区域设置,则不会向文件写入任何内容(在两个系统上)。

    1. 使用fwrite
    2. 下一次尝试:

      FILE* out = fopen("test.txt", "a+,ccs=UTF-8");
      fwrite(s.c_str(), wcslen(s.c_str()) * sizeof(wchar_t), 1, out);
      fclose(out);
      

      这适用于Windows,但不会在Linux上向该文件写入任何内容。我也尝试以二进制模式打开文件,但这并没有改变任何东西。未设置ccs部分会导致无法解密的垃圾写入文件。

      我显然在这里遗漏了一些东西:将该字符串写入文件的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用下一个代码剪切。与您的代码的不同之处在于我在这里使用了std :: codecvt_utf8而不是boost :: locale ....

#include <locale>
#include <codecvt>

----

std::wstring s = L"输入法.";

const std::locale utf8_locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t>());

myfile.open("E:/testFile.txt");
if (myfile.is_open())
{
    myfile.imbue(utf8_locale);
    myfile << s << endl;
    myfile.close();
}
else
{
    std::cout << "Unable to open file";
}

答案 1 :(得分:-1)

即使输入数据是Unicode,流类型也始终生成ASCII输出。首先,您应该为输出设置区域设置。只有在以后,你应该写任何文件。我想,这个例子可以帮到你。我在Ubuntu上运行它。

#include <cstdio>
#include <cwchar>
#include <string>
#include <locale>

void write_string(FILE *fd, std::wstring str)
{
    std::fputws(str.c_str(), fd);
}

int main()
{
    setlocale(0, "");
    FILE *fd = std::fopen("./test.txt", "w");

    write_string(fd, L"输入法.");

    std::fclose(fd);

    return 0;
}