我正在编写一个应用程序,需要我在任意窗口调用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";
低,看到程序的其余部分将输出打断到控制台窗口.
为什么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);
#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"; }