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 :



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

    最佳答案

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

    Windows API 中以 A 结尾的函数是 ANSI,但文件系统函数可以通过 SetFileApisToOEM 切换到 OEM。为了与遗留应用程序兼容,控制台 API 默认为 OEM,并且可以通过 SetConsoleCPSetConsoleOutputCP 更改为另一个代码页。 chcp.com(或mode.com)调用这些函数,但它不允许将输入缓冲区和屏幕缓冲区设置为不同的代码页。

    如果 ANSI 代码页是 1252,则 OEM 代码页不一定是 437。这仅适用于美国语言环境。大多数使用 1252 作为 ANSI 代码页的西方语言环境将使用 850 作为 OEM 代码页。

    表示正在使用用户代码页的应用程序可能不是指系统 ANSI 或 OEM 代码页。相反,它可以调用,例如, GetLocaleInfoEx 来查询 LOCALE_NAME_USER_DEFAULT 语言环境的 LOCALE_IDEFAULTANSICODEPAGELOCALE_IDEFAULTCODEPAGE

    关于windows - 为什么 ANSI 代码页和控制台代码页不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43189210/

    10-10 23:16