use*_*200 3 windows cmd codepages
很久以前,我想将 Windows 控制台的默认代码页 (CP) 更改为 UTF-8(以查看日文字符)。我不记得我使用的命令,但无论如何我最终设法能够查看 cmd.exe 上的字符。不久之后,我注意到任何使用 cmd.exe 的程序默认都在日语代码页 932 中,而 OEMCP 设置为 932。注意到这一点后,我检查了系统区域设置并将其更改为英语(美国)。执行此操作后,预计 OEMCP 将更改为 437,这也意味着 cmd.exe 的默认 CP 现在是 437。但是,即使在 OEMCP 更改为 437 之后,cmd 的默认 CP 也是如此。 exe仍然是 932。
那么如何将默认 CP 更改回 437?是什么导致它默认仍然是 CP 932?我已经从我的 PC 中完全删除了日语,以确保它不会导致问题,许多人告诉我使用自动运行文件或更改 OEMCP 以使用 CP 437,但是 OEMCP 已经设置为 437,我不想为 CP 437 使用自动运行文件,我只是希望它像以前一样成为默认值。
我还被告知每次打开 cmd.exe 时可能会有一个自动运行的脚本,但我不知道如何跟踪它或如何删除它。
更新:
问题在于使用 CP 932 的 cmd.exe
powershell.exe 和 netsh.exe 都已经在使用 CP 437
控制台窗口的默认配置存储在注册表项“HKCU\Console”中。该键中的大多数属性都可以在 GUI 中使用控制台的 Alt+Space [D]efaults 对话框进行配置。
当一个进程分配一个新的控制台时,其中一些默认值会被进程直接覆盖STARTUPINFO。这包括窗口位置和大小以及屏幕缓冲区大小和填充属性(即文本和背景颜色)。进程启动信息还包括初始窗口标题,如果父进程未设置,则默认为应用程序可执行文件的完全限定路径。如果应用程序使用 shell 快捷方式(即 LNK 文件)启动,则标题将是快捷方式文件的路径而不是可执行文件,并且STARTF_TITLEISLINKNAME会设置标志。
控制台使用初始窗口标题来加载自定义窗口的其他属性。如果STARTF_TITLEISLINKNAME设置了该标志,它会从启动应用程序的 LNK 快捷方式文件加载这些附加属性。否则,它会在注册表中查找规范化标题作为子项。为了规范标题,反斜杠被替换为下划线,Windows 目录被替换为“%SystemRoot%”。例如,如果初始窗口标题是“Spam\Eggs”,它会在“HKCU\Console\Spam_Eggs”下查找设置。这些属性可在 GUI 中使用控制台的 Alt+Space [P] 属性对话框进行配置。
可以设置的属性之一是DWORD名为“CodePage”的值。这是输入和输出的初始遗留代码页。(我说“遗留”是因为控制台有一个 Unicode API,应该总是首选。)如果它没有设置,控制台默认为 OEM 代码页(例如,西欧的 850 或美国的 437)。LNK 快捷方式还可以在其ConsoleFEDataBlock 中设置自定义代码页,但无法使用 GUI 甚至使用IShellLinkCOM 接口对其进行修改。
例如,如果 cmd.exe 直接从 Win+R 运行对话框运行而不是使用快捷方式,则它使用默认窗口标题“C:\Windows\System32\cmd.exe”。控制台在从“HKCU\Console”加载其默认值后,依次在子项“HKCU\Console\%SystemRoot%_System32_cmd.exe”中查找其他配置。在那里设置的“CodePage”值将覆盖控制台的默认 OEM 代码页。
不幸的是,如果我们想更改所有控制台应用程序的初始代码页,我们会很失望在“HKCU\Console”中设置它不起作用。由于控制台中的错误(当前由 conhostv2.dll 实现,托管在 conhost.exe 中),如果我们在“HKCU\Console”中设置默认的“CodePage”值,则控制台只会在加载和然后将自身重置为 OEM。
| 归档时间: |
|
| 查看次数: |
1188 次 |
| 最近记录: |