c ++ std :: wcout。失败和坏位设置

时间:2013-06-22 16:10:19

标签: c++

为什么L"&'v\x5\x17\x15-\x1dR\x14]Dv\x1991q-5Xp\x13\x172"类型的容器中的值std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >会在输出时在std::wcout中设置错误和失败位?

1 个答案:

答案 0 :(得分:0)

不确定您的代码中究竟发生了什么,但在Windows上您必须使用特定于平台的函数来在控制台中启用UTF-16支持,因为它使用您的默认ANSI代码页,即cp1251(请参阅http://www.siao2.com/2008/03/18/8306597.aspx)。这解决了坏位的问题:

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

/*...*/
_setmode( _fileno(stdout), _O_U16TEXT );
/*...*/

您还必须为控制台选择正确的字体,否则某些字符看起来像方块。例如,您可以选择Lucida Console或Consolas,但是如果您查看角色地图,您会发现这些字体中没有中文字符和许多其他字符。如果您想将字体更改为不同的字体,请尝试执行此操作https://superuser.com/questions/5035/how-to-change-the-windows-xp-console-font,但要小心(http://support.microsoft.com/kb/247815)。

还要记住,类似POSIX的操作系统和Windows上的Unicode支持是不同的。 Windows使用以wchar_t类型存储的UTF-16编码,而大多数POSIX操作系统使用UTF-8和char进行存储。