gpt4 book ai didi

c++ - wcout 不写宽字符到命令提示符

转载 作者:行者123 更新时间:2023-11-28 03:50:19 26 4
gpt4 key购买 nike

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

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

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

为什么 wcout 失败而其他人都成功了?

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

最佳答案

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

locale getloc() const;

If no locale has been imbued, a copy of the global C++ locale, locale(), in effect at the time of construction.

来自§22.1.1.2/1-2:

locale() throw();

Default constructor: a snapshot of the current global locale.

Constructs a copy of the argument last passed to locale::global(locale&), if it has been called; else, the resulting facets have virtual function semantics identical to those of locale::classic().

来自§22.1.1.5/4-6:

static const locale& classic();

The "C" locale.

Returns: A locale that implements the classic "C" locale semantics, equivalent to the value locale("C").

Notes: This locale, its facets, and their member functions, do not change with time.

由于 std::coutstd::wcout 具有静态存储持续时间,它们保证在调用 main 之前被初始化,因此将总是在应用程序启动时具有“C”语言环境;即,在执行过程中没有足够早的时间调用 locale::global 并更改 std::coutstd::wcout 的默认语言环境。因此,如果您想使用非默认代码页,您必须始终自己注入(inject)全局流。

关于c++ - wcout 不写宽字符到命令提示符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com