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

Windows 如果我的OEMCP设置为437,那么为什么我的cmd.exe默认代码页为932?我该如何解决这个问题?,windows,cmd,codepages,Windows,Cmd,Codepages,很久以前,我想将windows控制台的默认代码页(CP)更改为UTF-8(以查看日语字符)。我记不起我使用的命令了,但无论如何,我最终还是能够查看cmd.exe上的字符。但过了一会儿,我注意到任何使用cmd.exe的程序都默认位于日文代码页932中,OEMCP设置为932。注意到这一点后,我检查了,并将其更改为英语(美国)。这样做之后,预计OEMCP将更改为437,这也意味着cmd.exe的默认CP现在是437。然而,即使在OEMCP更改为437之后,cmd.exe的默认CP仍然是 那么,如何将

很久以前,我想将windows控制台的默认代码页(CP)更改为UTF-8(以查看日语字符)。我记不起我使用的命令了,但无论如何,我最终还是能够查看cmd.exe上的字符。但过了一会儿,我注意到任何使用cmd.exe的程序都默认位于日文代码页932中,OEMCP设置为932。注意到这一点后,我检查了,并将其更改为英语(美国)。这样做之后,预计OEMCP将更改为437,这也意味着cmd.exe的默认CP现在是437。然而,即使在OEMCP更改为437之后,cmd.exe的默认CP仍然是

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

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

更新:

问题在于cmd.exe使用CP 932


powershell.exe和netsh.exe都已在使用CP 437,控制台窗口的默认配置存储在注册表项“HKCU\console”中。此键中的大多数属性都可以在GUI中使用控制台的Alt+Space[D]efaults对话框进行配置

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

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

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

例如,如果cmd.exe直接从Win+R运行对话框运行,而不是使用快捷方式,则它将使用默认窗口标题“C:\Windows\System32\cmd.exe”。从“HKCU\console”加载默认值后,控制台依次在子键“HKCU\console\%SystemRoot%\u System32\u cmd.exe”中查找其他配置。此处设置的“代码页”值将覆盖控制台的默认OEM代码页

不幸的是,如果我们想更改所有控制台应用程序的初始代码页,那么在“HKCU\console”中设置它将无法工作,这将使我们感到失望。由于控制台中存在错误(当前由conhostv2.dll实现,托管在conhost.exe中),如果我们在“HKCU\console”中设置默认的“CodePage”值,则控制台在加载时仅短暂设置此值,然后将自身重置为OEM