我目前正在编写一个应用程序,它要求我在任意窗口上调用 GetWindowText 并将该数据存储到文件中以供以后处理。长话短说,我注意到我的工具在《战地 3》上失败了,我将问题范围缩小到窗口标题中的以下字符:http://www.fileformat.info/info/unicode/char/2122/index.htm http://www.fileformat.info/info/unicode/char/2122/index.htm
所以我创建了一个小测试应用程序,它只执行以下操作:
std::wcout << L"\u2122";
瞧,这会中断程序其余部分到控制台窗口的输出。
当 MessageBoxW 等 API 正常显示该字符(我假设还有其他字符)时,为什么 MSVC STL 会卡住?
如何将这些字符打印到我的文件中?
在 Windows 7 x64 下的 VC10 和 VC11 上进行了测试。
抱歉,这篇文章的结构很糟糕,我在这里撕扯我的头发。
Thanks.
EDIT:
最小测试用例
#include <fstream>
#include <iostream>
int main()
{
{
std::wofstream test_file("test.txt");
test_file << L"\u2122";
}
std::wcout << L"\u2122";
}
预期结果:“™”字符打印到控制台和文件。
观察结果:文件已创建但为空。没有输出到控制台。
我已经确认我的控制台使用的字体能够显示有问题的字符,并且该文件肯定是空的(大小为 0 字节)。
EDIT:
进一步的调试显示“failbit”和“badbit”已在流中设置。
EDIT:
我也尝试过使用 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)。
为此,您必须添加这两个包含文件:
#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";
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)