gpt4 book ai didi

windows - 为什么 ANSI 代码页和控制台代码页不同?

转载 作者:行者123 更新时间:2023-12-03 02:13:33 25 4
gpt4 key购买 nike

Microsoft Windows 提供了几个函数来查询当前代码页:GetACP , GetConsoleOutputCP , GetConsoleCP .

它们返回不同的值。例如,在我的计算机上,GetACP 返回 1252,而 GetConsoleOutputCPGetConsoleCP 返回 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 :

If no byte-order mark is found, it assumes the source file is encoded using the current user code page, unless you specify a character set name or code page by using the /source-charset option.

所以我试图找出它们引用的代码页,即由 GetACP 或其他返回的代码页...

最佳答案

ANSI 和 OEM 代码页由系统启动时加载的系统区域设置决定。它们作为 PEB 字段 AnsiCodePageData 映射到每个进程。和OemCodePageData 。 ntdll.dll 中的运行时库有许多处理这些字符串类型的函数,例如RtlAnsiStringToUnicodeStringRtlOemStringToUnicodeString .

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/

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