epotter Asked: 2009-11-03 10:50:46 +0800 CST2009-11-03 10:50:46 +0800 CST 2009-11-03 10:50:46 +0800 CST 如何手动确定当前操作系统的 CodePage 和 Locale 772 有没有一种方法可以让用户手动查找其 Windows 操作系统的当前代码页和语言环境?是否有存储该信息的注册表设置? 如果该技术可以一直使用到 Windows 2000,它也会很有用。 windows 4 个回答 Voted Best Answer Forgotten Semicolon 2009-11-03T10:56:21+08:002009-11-03T10:56:21+08:00 chcp将为您提供活动代码页。 systeminfo将显示系统区域设置和输入区域设置等。 "注意:此命令(systeminfo)在 Windows 2000 中不可用,但您仍然可以通过在 Windows XP 或 Windows 2003 计算机上运行此命令来查询 Windows 2000 计算机,并将远程计算机设置为 Windows 2000 计算机。如果当前用户登录执行此命令已经拥有远程机器的权限(例如,域管理员),您不必使用 /u 和 /p。” 从这里。 mklement 2017-03-04T20:34:52+08:002017-03-04T20:34:52+08:00 请注意,给定系统有两个感兴趣的活动代码页,由名为非 Unicode 程序语言的旧设置确定,以前称为系统区域设置(有关背景信息,请参阅底部部分): 供旧版控制台应用程序使用的OEM代码页, 旧版GUI应用程序使用的ANSI代码页。 注意:还有另外两个代码页,但它们已很少使用,因此这里不讨论:EBCDIC代码和(OS X 之前的)Mac代码页 - 请参阅WinAPI 文档。 活动的OEM 代码页最容易通过.chcpchcp <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 } } 警告:返回的信息不反映可能通过新的 Windows 10 功能实现的潜在 UTF-8覆盖(请参阅此 SO 答案);相反,该信息始终反映最初与活动系统区域设置关联的代码页。如果您确实需要知道 UTF-8 覆盖是否生效,请参阅下面基于注册表的方法。 在美英系统上,上述产生: Name DisplayName OEMCP ACP ---- ----------- ----- --- en-US English (United States) 437 1252 OEMCP是 OEM 代码页,ACPANSI 代码页。 一种基于注册表的方法,也适用于低至 Windows XP的旧系统: # Get the code pages: Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage | Select-Object OEMCP, ACP 在美英系统上,上述产生: OEMCP ACP ----- --- 437 1252 如果您还想获取系统区域设置的 [友好]名称和 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 并调用 Unicode 版本的 Windows API 的程序。 值得注意的是,它决定了活动代码页,即默认使用的字符编码: 当非 Unicode 程序调用 Windows API 的非 Unicode (ANSI) 版本时使用的ANSI 代码页TextOut,特别是用于将字符串转换为 Unicode 和从 Unicode 转换的函数的 ANSI 版本,它特别决定了程序的字符串在图形用户界面。 使用标准功能,您无法按需更改此代码页,因此您无法使用不同的 ANSI 代码页选择性地运行非 Unicode 程序。 Arioch '指向旧版 Microsoft 程序AppLocale的要点,即Windows 7 可用于根据需要运行具有可选系统区域设置的单个程序;但是,它似乎不再可供下载,并且似乎不再适用于 Windows 10。 Locale Emulator是一个开源的第三方解决方案,似乎在 AppLocale 停止的地方(我没有尝试过),并且支持 Windows 10 上的 32 位应用程序。 在控制台窗口中默认激活的OEM 代码页,如.chcp 控制台窗口的活动代码页决定了如何解释和显示来自控制台应用程序的键盘输入和输出。 请注意,这意味着即使来自Unicode控制台应用程序的输出也会被转换为活动代码页,这可能会导致信息丢失;使用代表 Unicode 的 UTF-8 编码的 pseudo code page65001是一种解决方案,但这可能会导致遗留命令行程序误解数据甚至失败 - 有关详细信息,请参阅此 StackOverflow 答案。 与 ANSI 代码页不同,您可以根据需要更改给定控制台窗口的活动 [OEM] 代码页;例如,切换到 OEM 代码页,在PowerShell 中850运行。chcp 850cmd.exe$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850) 此外,很少使用的EBCDIC和Mac代码页。 尽管旧术语中使用了语言环境一词,而当前术语中使用了语言一词: 该设置控制的唯一方面是活动代码页集和默认位图字体,而不是区域设置的其他元素(由用户级区域设置控制)。 给定的代码页通常由许多语言环境共享并涵盖多种语言;例如,广泛使用的1252代码页被许多西欧语言使用,包括英语。 但是,当您通过控制面板更改设置时,您确实会通过特定区域设置来选择设置。 有关所有 Windows 代码页的列表,请参阅https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers epotter 2009-11-03T12:01:51+08:002009-11-03T12:01:51+08:00 区域设置也可以在 msinfo32 中看到。 slowhand 2016-12-23T15:26:58+08:002016-12-23T15:26:58+08:00 返回活动代码页的 Windows API 是GetConsoleOutputCP()。
chcp将为您提供活动代码页。
systeminfo将显示系统区域设置和输入区域设置等。
"注意:此命令(systeminfo)在 Windows 2000 中不可用,但您仍然可以通过在 Windows XP 或 Windows 2003 计算机上运行此命令来查询 Windows 2000 计算机,并将远程计算机设置为 Windows 2000 计算机。如果当前用户登录执行此命令已经拥有远程机器的权限(例如,域管理员),您不必使用 /u 和 /p。”
从这里。
请注意,给定系统有两个感兴趣的活动代码页,由名为非 Unicode 程序语言的旧设置确定,以前称为系统区域设置(有关背景信息,请参阅底部部分):
注意:还有另外两个代码页,但它们已很少使用,因此这里不讨论:EBCDIC代码和(OS X 之前的)Mac代码页 - 请参阅WinAPI 文档。
活动的OEM 代码页最容易通过.
chcp
chcp <codePageNum>
确定活动的 ANSI 代码页并不那么简单,但PowerShell可以提供帮助,还可以确定系统区域设置的名称和语言:
在Windows 8+ / Windows Server 2012+ 中:使用
Get-WinSystemLocale
cmdlet:警告:返回的信息不反映可能通过新的 Windows 10 功能实现的潜在 UTF-8覆盖(请参阅此 SO 答案);相反,该信息始终反映最初与活动系统区域设置关联的代码页。如果您确实需要知道 UTF-8 覆盖是否生效,请参阅下面基于注册表的方法。
在美英系统上,上述产生:
OEMCP
是 OEM 代码页,ACP
ANSI 代码页。一种基于注册表的方法,也适用于低至 Windows XP的旧系统:
在美英系统上,上述产生:
如果您还想获取系统区域设置的 [友好]名称和 LCID(但请注意不推荐使用 LCID):
在美英系统上,上述产生:
背景资料:
系统语言环境是现在更具描述性地称为非 Unicode 程序语言的旧名称(请参阅NLS 术语),正如名称所示:
该设置仅适用于旧程序(不支持 Unicode 的程序)。
它适用于系统范围,与给定用户的区域设置无关,并且需要管理权限才能更改它。
需要注意的是,这是一个遗留设置,因为代码页不再适用于在内部使用 Unicode 并调用 Unicode 版本的 Windows API 的程序。
值得注意的是,它决定了活动代码页,即默认使用的字符编码:
当非 Unicode 程序调用 Windows API 的非 Unicode (ANSI) 版本时使用的ANSI 代码页
TextOut
,特别是用于将字符串转换为 Unicode 和从 Unicode 转换的函数的 ANSI 版本,它特别决定了程序的字符串在图形用户界面。在控制台窗口中默认激活的OEM 代码页,如.
chcp
65001
是一种解决方案,但这可能会导致遗留命令行程序误解数据甚至失败 - 有关详细信息,请参阅此 StackOverflow 答案。850
运行。chcp 850
cmd.exe
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)
此外,很少使用的EBCDIC和Mac代码页。
尽管旧术语中使用了语言环境一词,而当前术语中使用了语言一词:
该设置控制的唯一方面是活动代码页集和默认位图字体,而不是区域设置的其他元素(由用户级区域设置控制)。
给定的代码页通常由许多语言环境共享并涵盖多种语言;例如,广泛使用的
1252
代码页被许多西欧语言使用,包括英语。但是,当您通过控制面板更改设置时,您确实会通过特定区域设置来选择设置。
有关所有 Windows 代码页的列表,请参阅https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiers
区域设置也可以在 msinfo32 中看到。
返回活动代码页的 Windows API 是GetConsoleOutputCP()。