有没有办法让用户手动查找其 Windows 操作系统的当前代码页和语言环境?是否有用于存储该信息的注册表设置?
如果该技术能够一直应用于 Windows 2000,那么它也会很有用。
答案1
答案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代码页,ACP
ANSI代码页。
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 中的呈现方式。- 使用标准功能,您不能更改此代码页一经请求,因此您无法有选择地运行具有不同 ANSI 代码页的非 Unicode 程序。
- 亚略指向旧版 Microsoft 程序应用本地化那最高可达 Windows 7 可用于运行个人计划具有可选择的系统区域设置按需提供;然而,它似乎不再可供下载,在 Windows 10 中似乎不再起作用。
- 区域设置模拟器,一个开源的第三方解决方案,似乎从 AppLocale 停止的地方开始(我还没有尝试过),并且支持 Windows 10 上的 32 位应用程序。
这OEM 代码页默认启用在控制台窗口,正如 所反映的
chcp
。- 控制台窗口的活动代码页决定如何键盘输入并输出控制台应用程序被解释并显示。
- 请注意,这意味着即使来自统一码控制台应用程序被翻译成活动代码页,这可能会导致信息丢失;使用伪代码页
65001
(代表 Unicode 的 UTF-8 编码)是一种解决方案,但这可能会导致遗产命令行程序会误解数据,甚至导致失败 - 请参阅这个 StackOverflow 答案了解详情。
- 请注意,这意味着即使来自统一码控制台应用程序被翻译成活动代码页,这可能会导致信息丢失;使用伪代码页
- 与 ANSI 代码页不同,你能根据给定控制台窗口的需求更改活动的 [OEM] 代码页;例如,切换到 OEM 代码页
850
,chcp 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()。