【问题标题】:Can't write wstring with Russian characters to file无法将带有俄语字符的 wstring 写入文件
【发布时间】:2012-08-14 20:32:55
【问题描述】:

我正在尝试在 Linux 中使用以下代码中的 C++ 代码编写 wstrings(俄语):

ofstream outWFile;
outWFile.open("input.tab");
outWFile<< WStringToString(w->get_form());
outWFile<<"\t";
outWFile<<WStringToString(w->get_tag());

std::string WStringToString(const std::wstring& s)
{
    std::string temp(s.length(),' ');
    std::copy(s.begin(), s.end(), temp.begin());
    return temp;
}

input.tab 内容无效

我已尝试执行 stackoverflow 中建议的操作,包括 Unable to write a std::wstring into wofstream 然而我没有帮忙。 提前谢谢你

【问题讨论】:

  • 那些ostream&lt;&lt; 应该是outWFile
  • 您的代码根本不显示写入文件,只显示标准输出。
  • 您认为这段代码应该如何工作?你希望它如何工作?在发布此内容之前,您做了哪些努力来了解您的问题?您是否注意到函数 WStringToString 完全破坏了非 ASCII 内容?

标签: c++ linux wstring wofstream


【解决方案1】:

您的转换函数有问题:它最终会弄乱所有代码点为 128/256 或更大的字符(取决于您的语言环境)。

请改用 wcstombs(确保使用 UTF-8 语言环境)。

【讨论】:

  • WStringToString 肯定是错误的,但尚不清楚它是否用于写入文件。另外,出于您提到的原因,我不建议您依赖基于语言环境的转换,例如 wcstombs;您必须确保区域设置适合您的使用,如果不是,则必须更改。这不可靠或用户友好。仅当您真正想要使用区域设置编码时才应使用基于区域设置的转换,无论它们是什么(这在 IME 中很少见)。
  • @bames53:是的,语言环境可能会导致问题。我个人的大部分 Linux 编码都是在假设(如果适用)它与 UTF-8 语言环境一起使用的情况下进行的,就像任何现代 Linux 系统一样,但我想我可以建议一些不那么脆弱的东西,因为 C++内置 Unicode 工具。
  • 是的,我也只是假设 UTF-8 始终适用于所有内容并忽略区域设置编码。唯一的问题出现在值得他们这样做的人身上。
【解决方案2】:

我认为直接使用 wstring 内容会更好。

outWfile.write(w->get_tag()->data(), w->get_tag()->size()*sizeof(wchar_t));
// I used data() assuming the string and wstring methods are the same?
// Anyhow, get the pointer to wstring's data here.

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 2011-03-13
    • 2015-01-08
    • 2016-11-10
    • 1970-01-01
    • 2015-01-03
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多