Windows Unicode C流输出故障

前端之家收集整理的这篇文章主要介绍了Windows Unicode C流输出故障前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个应用程序,需要我在任意窗口调用GetWindowText,并将该数据存储到一个文件中以备后续处理.长篇小说,我注意到我的工具在“战地3”上失败了,我将窗口标题中的问题缩小到下列字符:
http://www.fileformat.info/info/unicode/char/2122/index.htm

所以我创建了一个测试应用程序,它只是执行以下操作:

std::wcout << L"\u2122";

低,看到程序的其余部分将输出打断到控制台窗口.

为什么MSVC STL窒息这个角色(和我假设他人)当API像MessageBoxW等显示它很好吗?

如何将这些字符打印到我的文件

在Windows 7 x64上测试VC10和VC11.

对不起,建设不好的帖子,我在这里撕我的头发.

谢谢.

编辑:

最小测试用例

#include <fstream>
#include <iostream>

int main()
{
  {
    std::wofstream test_file("test.txt");
    test_file << L"\u2122";
  }

  std::wcout << L"\u2122";
}

预期结果:’™’字符打印到控制台和文件.
观察结果:文件创建但为空.没有输出到控制台.

我已经确认我使用我的控制台的字体能够显示有问题的字符,并且该文件绝对是空的(大小为0字节).

编辑:

进一步的调试显示在流中设置了’failbit’和’badbit’.

编辑:

我也尝试使用Boost.Locale,即使全新的语言环境和所有标准流都是明确的,我也有同样的问题.

要写入文件,您必须正确设置区域设置,例如,如果要将其写入UTF-8字符,则必须添加
const std::locale utf8_locale
            = std::locale(std::locale(),new std::codecvt_utf8<wchar_t>());
test_file.imbue(utf8_locale);

您必须添加这2个包含文件

#include <codecvt>
#include <locale>

要写入控制台,您必须通过添加将控制台设置为正确的模式(这是Windows特定的)

_setmode(_fileno(stdout),_O_U8TEXT);

(以防您想使用UTF-8).

为此,您必须添加这2个包含文件

#include <fcntl.h>
#include <io.h>

此外,您必须确保您使用的是支持Unicode的字体(例如Lucida Console).您可以更改控制台窗口属性中的字体.

完整的程序现在如下所示:

#include <fstream>
#include <iostream>
#include <codecvt>
#include <locale>
#include <fcntl.h>
#include <io.h>

int main()
{

  const std::locale utf8_locale = std::locale(std::locale(),new std::codecvt_utf8<wchar_t>());
  {
    std::wofstream test_file("c:\\temp\\test.txt");
    test_file.imbue(utf8_locale);
    test_file << L"\u2122";
  }

  _setmode(_fileno(stdout),_O_U8TEXT);
  std::wcout << L"\u2122";
}

猜你在找的Windows相关文章