我试图在Windows命令提示符下写出以下字符:ュ(U + FF6D)。
我能够看到使用WriteConsoleW写出字符。如果我使用CP_ACP代码页(chcp返回932:日语)使用WideCharToMultiByte,我也能看到该字符。但是,当我尝试在WriteConsoleW成功打印的同一个字符串上使用常规wcout时,它会窒息。
当我执行setlocale(LC_ALL,“”)时,它会打印English_UnitedStates.1252(我安装时的默认代码页)。
为什么当其他人成功时wcout会失败?
注意:我重新启动计算机以将其系统区域设置更改为日语日语
答案 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::cout
和std::wcout
具有静态存储持续时间,因此保证在调用main
之前初始化它们,因此总是具有“C” “应用程序启动时的语言环境;也就是说,执行早期没有任何意义,可以调用locale::global
并更改std::cout
和std::wcout
的默认语言环境。因此,如果要使用非默认代码页,则必须始终自己注入全局流。
答案 1 :(得分:0)
wcout
中的任何代码执行之前, main
已创建。当您致电setlocale
时,wcout
已经存在,准备做其事。它不会尝试跟踪您使用setlocale
进行的后续更改,因此它会继续使用默认值而不是您使用setlocale
设置的任何内容。