Microsoft Windows提供了几种查询当前代码页的功能: GetACP
,GetConsoleOutputCP
,GetConsoleCP
。为什么ANSI代码页和控制台代码页是不同的?
它们返回不同的值。例如,我的机器上,GetACP
回报1252,而GetConsoleOutputCP
和GetConsoleCP
返回437
(我们也可以运行在命令行上chcp
并获得437)
- 为什么Windows提供不同的代码页控制台和非控制台?
- 这些代码页是如何确定每台机器?
- 同一台机器上的代码页之间的关系是什么?控制台和非控制台代码页之间是否存在关联?具有代码页1252的机器是否总是拥有437的控制台代码页?
对这个问题的背景是从Visual Studio C++的错误消息:发生
error C2855: command-line option '/source-charset' inconsistent with precompiled header
error C2855: command-line option '/execution-charset' inconsistent with precompiled header
这些错误时,预编译的头文件是用不同的默认代码页比是CPP文件建使用它们(出于任何原因)。
从MSDN docs:
如果没有发现字节顺序标记时,它假定源文件使用当前用户代码页编码 ,除非你指定一个字符通过设置 名称或代码页/ source-charset选项。
所以我想弄清楚他们是指,由GetACP
或其他返回的其中一个代码页...
对于下流者来说,如果你没有解释就冷静下来,那就是你的特权。但至少给出一点反馈让我知道什么是错的更有帮助;如果我有改进答案的方法,或者您的理由足够重要,我应该删除此答案。 – eryksun
downvoter可能是拖钓。没有解释,这个问题也被低估了。现在你提到的最后一件事让我感到困惑。除了ANSI和OEM之外,我们还有其他代码页吗?根据[此MSDN页面](https://msdn.microsoft.com/en-us/library/windows/desktop/dd373761(v = vs.85).aspx)'LOCALE_IDEFAULTANSICODEPAGE'返回ANSI代码页和'LOCALE_IDEFAULTCODEPAGE '返回OEM代码页。它们与'GetACP','GetConsoleCP'等返回的代码页有什么不同? –
大多数Windows语言环境都定义了ANSI和OEM代码页。用户的区域设置不一定与系统区域设置相同。您可以使用控制面板中的区域应用更改用户区域设置(即“格式”)。 'GetLocaleInfoEx'将在为'LOCALE_IDEFAULTANSICODEPAGE'和'LOCALE_IDEFAULTCODEPAGE'(OEM)返回的值中动态地反映。但是,更改系统区域设置(区域 - >管理)需要重新启动以查看'GetACP()'和'GetOEMCP()'中反映的更改。 – eryksun