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:temptest.txt"); test_file.imbue(utf8_locale); test_file << L"u2122"; } _setmode(_fileno(stdout),_O_U8TEXT); std::wcout << L"u2122"; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |