如何手动确定当前操作系统的CodePage和区域设置


13

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

如果该技术一直运行到Windows 2000,也会很有用。

Answers:


16

chcp将为您提供活动代码页。

systeminfo将显示系统语言环境和输入语言环境,等等。

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


1
请注意,这chcp将为您提供活动的OEM代码页。正如mklement在他的回答中指出的那样,Windows始终存在另一个活动代码页,即ANSI代码页。有关更多信息,请参见mklement的答案
kangalioo

6

请注意,一个给定的系统有两个感兴趣的活动代码页,这由旧设置(称为非Unicode程序的语言)决定,以前称为系统区域设置(有关背景信息,请参见底部):

  • 旧版控制台应用程序使用的OEM代码页,
  • 旧版GUI应用程序使用的ANSI代码页。

注意:还有两个代码页,但是现在很少使用了,因此这里不再讨论:EBCDIC代码和(OS X之前的)Mac代码页-请参见WinAPI文档

活动的OEM代码页是最容易获得通过chcp所示,被遗忘的分号的有用的答案 -假设它没有明确地与会话改变chcp <codePageNum>

确定活动的ANSI代码页不是那么简单,但是PowerShell可以帮助确定系统语言环境的名称和语言

Windows 8 + / Windows Server 2012+中:使用Get-WinSystemLocalecmdlet:

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

注:可能是诱人的使用[cultureinfo]::CurrentCulture.TextInfo.ANSICodePage,例如,但这并不一定反映全系统主动ANSI代码页; 而是与当前用户的区域设置(区域性)相关联的ANSI代码页,该页面可能有所不同。

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

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

OEMCP是OEM代码页,ACP即ANSI代码页。

一种基于注册表的方法,该方法也可以在较低版本的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的程序)。

  • 适用于系统范围的,而不管给定用户的语言环境设置如何,并且需要管理特权才能对其进行更改。

重要的是要注意,这是一个设置,因为代码页不再适用于内部使用Unicode并调用Windows API的Unicode版本的程序。

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

  • 非Unicode程序调用Windows API的非Unicode(ANSI)版本时要使用的ANSI代码页,尤其是TextOut用于将字符串与Unicode相互转换的函数的ANSI版本,这尤其决定了程序的字符串如何在 Windows中呈现。 GUI

  • OEM代码页,使活跃在默认情况下控制台窗口中,通过反映chcp

    • 控制台窗口的活动代码页确定如何解释和显示来自控制台应用程序的键盘输入和输出
      • 请注意,这意味着即使将Unicode控制台应用程序的输出也转换为活动代码页,这也可能导致信息丢失。使用伪代码页65001(代表Unicode的UTF-8编码)是一种解决方案,但可能导致旧版命令行程序误解数据甚至失败- 有关详细信息,请参见StackOverflow答案
    • 与ANSI代码页不同,可以根据需要为给定的控制台窗口更改活动的[OEM]代码页;例如,要切换到OEM代码页面850,请在chcp 850cmd.exe$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)在PowerShell中运行。
  • 此外,现在很少使用的EBCDICMac代码页。

尽管在遗留术语中使用了语言环境一词,而在当前术语中使用了语言一词:

  • 设置所控制的唯一方面是活动代码页和默认位图字体集合,而不是语言环境的其他元素(由用户级语言环境设置控制)。

  • 一个给定的代码页通常由许多语言环境共享和盖的多个语言; 例如,广泛使用的1252代码页被许多西欧语言使用,包括英语。

但是,当您更改通过控制面板设置,你就挑设置途经一个特定的语言环境。

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


GetACP()函数-technet.microsoft.com/zh-cn/dd318070-这是一个有趣的链接,备注部分完全告诉此函数返回值,并不代表用户选择的默认输入语言和GUI语言,而是完全不同的内容……
Arioch'

事实上,@ Arioch'The -这就是我想在背景信息部分澄清:系统区域(一)确定代码页(但没有其他区域设置)系统范围,(B) ,不论给定的用户语言环境。注意如何链接的页面状态(强调):“返回当前的Windows ANSI代码页(ACP)的标识符操作系统 ”。至于可能的AppLocale第三方替代品:我已添加了答案的链接。
mklement

1
我认为GetACP注释/链接很重要,因为它是MBCS到Unicode默认转换旨在独立于用户和OS全局的“上帝之言”确认,而不仅仅是某些Windows版本中的实现细节。
Arioch'The

1
今天,也许在UNIX之前的MAC和EBCDIC都同样属于“仅具有某些历史意义”的领域。但是,我还是对MAC CP有所依恋,因为他们设法在纯文本文件中做出了另一种标记新行的变体,与UNIX和DOS-Win-OS / 2树不同。我记得那是异国情调的极端案例。
Arioch

1
谢谢。更多主题链接-docs.microsoft.com/zh-cn/windows/desktop/Intl/…- 且EBCDIC被标记为“ Windows 2000”-因此在w2k之前它可能不存在,并且从那以后的所有年中都没有人打扰过更新我使用的标头转换源:-D
Arioch


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.