如果我的OEMCP设置为437,那么为什么我的cmd.exe默认代码页932?以及如何解决此问题?

时间:2017-11-06 22:40:30

标签: windows cmd codepages

很久以前我想将Windows控制台的默认代码页(CP)更改为UTF-8(查看日文字符)。我无法记住我使用的命令,但无论如何我最终设法能够查看cmd.exe上的字符。但是很短的时间后,我注意到任何使用cmd.exe的程序默认都在日文代码页932中,而OEMCP设置为932.注意到后我检查了System Locale并将其更改为英文(美国) )。执行此操作后,预计OEMCP将更改为437 which it had,这也应该意味着cmd.exe的默认CP现在为437.但是,即使在OEMCP已更改为437之后,默认CP为cmd.exe是still 932

那么如何将默认CP更改回437?究竟是什么导致它仍然是CP 932?我已经完全从我的电脑中删除了日语,以确保它不会导致问题,许多人告诉我使用自动运行文件或更改OEMCP使用CP 437,但是OEMCP已经设置为437我不想为CP 437使用自动运行文件,我只是希望它是以前的默认值。

我还被告知每次打开cmd.exe时都会有一个自动运行的脚本,但我不知道如何跟踪它或如何删除它。

更新

问题在于使用CP 932的cmd.exe

powershell.exe和netsh.exe都已在使用CP 437

1 个答案:

答案 0 :(得分:3)

控制台窗口的默认配置存储在注册表项“HKCU \ Console”中。使用控制台的Alt + Space [D] efaults对话框,可以在GUI中配置此键中的大多数属性。

当进程分配新控制台时,进程STARTUPINFO会直接覆盖其中一些默认值。这包括窗口位置和大小以及屏幕缓冲区大小和填充属性(即文本和背景颜色)。进程启动信息还包括初始窗口标题,如果未由父进程设置,则默认为应用程序可执行文件的完全限定路径。如果使用shell快捷方式(即LNK文件)启动应用程序,则标题将是快捷方式文件的路径而不是可执行文件,并且将设置标记STARTF_TITLEISLINKNAME

控制台使用初始窗口标题来加载自定义窗口的其他属性。如果设置了STARTF_TITLEISLINKNAME标志,则会从启动应用程序的LNK快捷方式文件中加载这些附加属性。否则,它会将规范化标题作为注册表中的子项查找。要标准化标题,反斜杠将替换为下划线,Windows目录将替换为“%SystemRoot%”。例如,如果初始窗口标题是“Spam \ Eggs”,则它会在“HKCU \ Console \ Spam_Eggs”下查找设置。可以使用控制台的Alt + Space [P] roperties对话框在GUI中配置这些属性。

可以设置的一个属性是名为“CodePage”的DWORD值。这是输入和输出的初始遗留代码页。 (我说“遗留”是因为控制台有一个永远是首选的Unicode API。)如果没有设置,控制台默认为OEM代码页(例如西欧的850或美国的437)。 LNK快捷方式还可以在其ConsoleFEDataBlock中设置自定义代码页,但无法使用GUI或甚至使用IShellLink COM接口对其进行修改。

例如,如果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。