Microsoft Windows 提供了几个函数来查询当前代码页:
GetACP
, GetConsoleOutputCP
, GetConsoleCP
。
它们返回不同的值。例如,在我的机器上,GetACP
返回 1252,而 GetConsoleOutputCP
和 GetConsoleCP
返回 437。
(我们也可以在命令行运行chcp
,得到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 :
所以我试图找出他们引用的代码页,由
GetACP
或其他返回的代码页...... 最佳答案
ANSI 和 OEM 代码页由系统启动时加载的系统区域设置决定。它们作为 PEB 字段 AnsiCodePageData
和 OemCodePageData
映射到每个进程中。 ntdll.dll 中的运行时库有许多处理这些字符串类型的函数,例如RtlAnsiStringToUnicodeString
和 RtlOemStringToUnicodeString
。
Windows API 中以 A 结尾的函数是 ANSI,但文件系统函数可以通过 SetFileApisToOEM
切换到 OEM。为了与遗留应用程序兼容,控制台 API 默认为 OEM,并且可以通过 SetConsoleCP
和 SetConsoleOutputCP
更改为另一个代码页。 chcp.com(或mode.com)调用这些函数,但它不允许将输入缓冲区和屏幕缓冲区设置为不同的代码页。
如果 ANSI 代码页是 1252,则 OEM 代码页不一定是 437。这仅适用于美国语言环境。大多数使用 1252 作为 ANSI 代码页的西方语言环境将使用 850 作为 OEM 代码页。
表示正在使用用户代码页的应用程序可能不是指系统 ANSI 或 OEM 代码页。相反,它可以调用,例如, GetLocaleInfoEx
来查询 LOCALE_NAME_USER_DEFAULT
语言环境的 LOCALE_IDEFAULTANSICODEPAGE
或 LOCALE_IDEFAULTCODEPAGE
。
关于windows - 为什么 ANSI 代码页和控制台代码页不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43189210/