如何手动确定当前操作系统的 CodePage 和 Locale

如何手动确定当前操作系统的 CodePage 和 Locale

有没有办法让用户手动查找其 Windows 操作系统的当前代码页和语言环境?是否有用于存储该信息的注册表设置?

如果该技术能够一直应用于 Windows 2000,那么它也会很有用。

答案1

慢性肾衰竭将获得活动代码页。

系统信息将显示系统区域设置和输入区域设置等。

笔记:此命令 (systeminfo) 在 Windows 2000 中不可用,但您仍然可以通过在 Windows XP 或 Windows 2003 计算机上运行此命令来查询 Windows 2000 计算机,并将远程计算机设置为 Windows 2000 计算机。如果执行此命令的当前用户登录已经在远程计算机上拥有权限(例如,域管理员),则不必使用 /u 和 /p。”
来自这里

答案2

注意给定系统有感兴趣的活动代码页,由旧设置决定非 Unicode 程序的语言, 原名系统区域设置(请参阅底部的背景信息):

  • 原始设备制造商代码页用于旧版安慰应用程序,
  • 美国国家标准代码页用于旧版图形用户界面应用程序。

注意:另外两个代码页,但它们很少再使用,因此这里不再讨论:EBCDIC代码和(OS X 之前)苹果代码页-参见WinAPI 文档

活动 OEM 代码页最容易获得的方式chcp如下忘记分号的有用答案- 假设控制台窗口未通过注册表配置自定义代码页,并且代码页在会话中未明确更改chcp <codePageNum>

确定活动 ANSI 代码页并不是那么简单,但是电源外壳也可以帮助确定姓名和语言系统区域设置:

Windows 8+ / Windows Server 2012+: 使用Get-WinSystemLocale命令:

Get-WinSystemLocale | Select-Object Name, DisplayName, 
                        @{ n='OEMCP'; e={ $_.TextInfo.OemCodePage } }, 
                        @{ n='ACP';   e={ $_.TextInfo.AnsiCodePage } }

警告:返回的信息不是反映潜在的 UTF-8覆盖可能会通过 Windows 10 的一项新功能实现(看这个答案);相反,信息总是反映代码页起初与活动系统区域设置相关联。如果您确实需要知道 UTF-8 覆盖是否有效,请参阅下面基于注册表的方法。

在美国英语系统上,上述结果为:

Name  DisplayName             OEMCP  ACP
----  -----------             -----  ---
en-US English (United States)   437 1252

OEMCP是OEM代码页,ACPANSI代码页。

A基于注册表的方法也适用于旧系统降至 Windows XP

# Get the code pages:
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage | 
     Select-Object OEMCP, ACP

在美国英语系统上,上述结果为:

OEMCP ACP 
----- --- 
437   1252

如果你也想获取系统语言环境的 [friendly]姓名和 LCID(不过请注意,LCID 已被弃用):

[Globalization.CultureInfo]::GetCultureInfo([int] ('0x' + (
        Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language' Default
      ).Default)
)

在美国英语系统上,上述结果为:

LCID             Name             DisplayName                                                                                                                                      
----             ----             -----------                                                                                                                                      
1033             en-US            English (United States)                                                                                                                          

背景信息

系统区域设置是个遗留名称现在更准确地说是非 Unicode 程序的语言(看NLS 术语),顾名思义:

  • 设置仅适用于遗留程序(不支持 Unicode 的程序)。

  • 适用全系统,无论给定用户的区域设置,并且需要管理权限才能更改它。

值得注意的是A遗产环境, 因为代码页不再适用于使用 Unicode 的程序内部并调用 Windows API 的 Unicode 版本。

值得注意的是,它决定活动代码页,即字符编码默认使用

  • ANSI 代码页当非 Unicode 程序调用非 Unicode(ANSI)版本的 Windows API 时使用,特别是TextOut用于将字符串转换为 Unicode 和从 Unicode 转换的函数的 ANSI 版本,特别是确定程序的字符串在 GUI 中的呈现方式

  • OEM 代码页默认启用控制台窗口,正如 所反映的chcp

    • 控制台窗口的活动代码页决定如何键盘输入并输出控制台应用程序被解释并显示
      • 请注意,这意味着即使来自统一码控制台应用程序被翻译成活动代码页,这可能会导致信息丢失;使用伪代码页65001(代表 Unicode 的 UTF-8 编码)是一种解决方案,但这可能会导致遗产命令行程序会误解数据,甚至导致失败 - 请参阅这个 StackOverflow 答案了解详情。
    • 与 ANSI 代码页不同,根据给定控制台窗口的需求更改活动的 [OEM] 代码页;例如,切换到 OEM 代码页850chcp 850在中运行cmd.exe,然后$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)在 PowerShell 中运行。
  • 此外,现在很少使用的EBCDIC苹果代码页。

尽管区域设置在传统术语和词语中使用语言在本任期内:

  • 仅有的由设置控制的方面是活动代码页集和默认位图字体,而不是区域设置的其他元素(由用户级区域设置控制)。

  • 给定的代码页通常许多地区都共享和封面多种的语言;例如广泛使用的1252代码页被许多西欧语言使用,包括英语。

但是,当您通过控制面板更改设置时,您确实会选择设置通过特定区域。

有关所有 Windows 代码页的列表,请参阅https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers

答案3

您还可以在 msinfo32 中查看区域设置。

答案4

返回活动代码页的 Windows API 是获取控制台输出CP()

相关内容