wcout没有将宽字符写入命令提示符

时间:2011-04-21 23:29:07

标签: c++ windows internationalization

我试图在Windows命令提示符下写出以下字符:ュ(U + FF6D)。

我能够看到使用WriteConsoleW写出字符。如果我使用CP_ACP代码页(chcp返回932:日语)使用WideCharToMultiByte,我也能看到该字符。但是,当我尝试在WriteConsoleW成功打印的同一个字符串上使用常规wcout时,它会窒息。

当我执行setlocale(LC_ALL,“”)时,它会打印English_UnitedStates.1252(我安装时的默认代码页)。

为什么当其他人成功时wcout会失败?

注意:我重新启动计算机以将其系统区域设置更改为日语日语

2 个答案:

答案 0 :(得分:2)

C ++ iostreams的默认语言环境始终是“C”语言环境。从C ++ 03标准,§27.4.2.3/ 4:

  

locale getloc() const;

     

如果没有嵌入语言环境,则构建时生效的全局C ++语言环境locale()的副本。

来自§22.1.1.2/ 1-2:

  

locale() throw();

     

默认构造函数:当前全局区域设置的快照。

     

构造最后传递给locale::global(locale&)的参数的副本(如果已被调用);否则,生成的facet具有与locale::classic()相同的虚函数语义。

来自§22.1.1.5/ 4-6:

  

static const locale& classic();

     

“C”语言环境。

     

返回:实现经典“C”语言环境语义的语言环境,等同于值locale("C")

     

注意:此区域设置,其构面及其成员函数不会随时间而变化。

由于std::coutstd::wcout具有静态存储持续时间,因此保证在调用main之前初始化它们,因此总是具有“C” “应用程序启动时的语言环境;也就是说,执行早期没有任何意义,可以调用locale::global并更改std::coutstd::wcout的默认语言环境。因此,如果要使用非默认代码页,则必须始终自己注入全局流。

答案 1 :(得分:0)

wcout中的任何代码执行之前, main已创建。当您致电setlocale时,wcout已经存在,准备做其事。它不会尝试跟踪您使用setlocale进行的后续更改,因此它会继续使用默认值而不是您使用setlocale设置的任何内容。