如果我的 OEMCP 设置为 437 那么为什么我的 cmd.exe 默认代码页是 932?我该如何解决这个问题?
If my OEMCP is set to 437 then why is my cmd.exe default codepage 932? and how do I fix this?
很久以前,我想将 windows 控制台的默认代码页 (CP) 更改为 UTF-8(以查看日文字符)。我不记得我使用的命令,但无论如何我最终设法能够查看 cmd.exe 上的字符。不过不久之后,我注意到任何使用 cmd.exe 的程序默认都在日语代码页 932 中,而 OEMCP 设置为 932。注意到这一点后,我检查了 System Locale and changed it to English (United States). After doing this it was expected that OEMCP would have changed to 437, which it had and which also should have meant the default CP of cmd.exe was now 437. However even after the OEMCP had been changed to 437 the default CP of cmd.exe was still 932.
那么如何将默认 CP 更改回 437?是什么导致它默认仍然是 CP 932?我已经从我的 PC 中完全删除日语以确保它不会导致问题,许多人告诉我使用自动运行文件或更改 OEMCP 以使用 CP 437,但是 OEMCP 已经设置为 437,我不想为 CP 437 使用自动运行文件,我只是希望它像以前一样成为默认值。
有人告诉我,每次打开 cmd.exe 时,可能会有一个自动 运行 的脚本,但我不知道如何跟踪或删除它。
更新:
问题在于 cmd.exe 使用 CP 932
powershell.exe 和 netsh.exe 都已经在使用 CP 437
控制台 windows 的默认配置存储在注册表项 "HKCU\Console" 中。使用控制台的 Alt+Space [D]efaults 对话框可以在 GUI 中配置此键中的大部分属性。
当一个进程分配一个新的控制台时,其中一些默认值会被进程直接覆盖 STARTUPINFO
。这包括 window 位置和大小以及屏幕缓冲区大小和填充属性(即文本和背景颜色)。进程启动信息还包括初始 window 标题,如果 parent 进程未设置,则默认为应用程序可执行文件的 fully-qualified 路径。如果应用程序使用 shell 快捷方式(即 LNK 文件)启动,标题将是快捷方式文件的路径而不是可执行文件,并且将设置标志 STARTF_TITLEISLINKNAME
。
控制台使用初始 window 标题加载自定义 window 的其他属性。如果设置了 STARTF_TITLEISLINKNAME
标志,它会从启动应用程序的 LNK 快捷方式文件加载这些附加属性。否则,它会在注册表中查找规范化的标题作为子项。为了使标题规范化,反斜杠被替换为下划线,Windows 目录被替换为“%SystemRoot%”。例如,如果初始 window 标题是 "Spam\Eggs",它会在 "HKCU\Console\Spam_Eggs" 下查找设置。使用控制台的 Alt+Space [P]roperties 对话框可以在 GUI 中配置这些属性。
可以设置的属性之一是名为 "CodePage" 的 DWORD
值。这是输入和输出的初始遗留代码页。 (我说 "legacy" 因为控制台有一个 Unicode API,应该始终是首选。)如果未设置,控制台默认为 OEM 代码页(例如西欧的 850 或 U.S.)。 LNK 快捷方式还可以在其 ConsoleFEDataBlock 中设置自定义代码页,但无法使用 GUI 或什至使用 IShellLink
COM 接口修改它。
例如,如果 cmd.exe 是 运行 直接来自 Win+R 运行 对话框而不是使用快捷方式,它使用默认的 window 标题 "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。
很久以前,我想将 windows 控制台的默认代码页 (CP) 更改为 UTF-8(以查看日文字符)。我不记得我使用的命令,但无论如何我最终设法能够查看 cmd.exe 上的字符。不过不久之后,我注意到任何使用 cmd.exe 的程序默认都在日语代码页 932 中,而 OEMCP 设置为 932。注意到这一点后,我检查了 System Locale and changed it to English (United States). After doing this it was expected that OEMCP would have changed to 437, which it had and which also should have meant the default CP of cmd.exe was now 437. However even after the OEMCP had been changed to 437 the default CP of cmd.exe was still 932.
那么如何将默认 CP 更改回 437?是什么导致它默认仍然是 CP 932?我已经从我的 PC 中完全删除日语以确保它不会导致问题,许多人告诉我使用自动运行文件或更改 OEMCP 以使用 CP 437,但是 OEMCP 已经设置为 437,我不想为 CP 437 使用自动运行文件,我只是希望它像以前一样成为默认值。
有人告诉我,每次打开 cmd.exe 时,可能会有一个自动 运行 的脚本,但我不知道如何跟踪或删除它。
更新:
问题在于 cmd.exe 使用 CP 932
powershell.exe 和 netsh.exe 都已经在使用 CP 437
控制台 windows 的默认配置存储在注册表项 "HKCU\Console" 中。使用控制台的 Alt+Space [D]efaults 对话框可以在 GUI 中配置此键中的大部分属性。
当一个进程分配一个新的控制台时,其中一些默认值会被进程直接覆盖 STARTUPINFO
。这包括 window 位置和大小以及屏幕缓冲区大小和填充属性(即文本和背景颜色)。进程启动信息还包括初始 window 标题,如果 parent 进程未设置,则默认为应用程序可执行文件的 fully-qualified 路径。如果应用程序使用 shell 快捷方式(即 LNK 文件)启动,标题将是快捷方式文件的路径而不是可执行文件,并且将设置标志 STARTF_TITLEISLINKNAME
。
控制台使用初始 window 标题加载自定义 window 的其他属性。如果设置了 STARTF_TITLEISLINKNAME
标志,它会从启动应用程序的 LNK 快捷方式文件加载这些附加属性。否则,它会在注册表中查找规范化的标题作为子项。为了使标题规范化,反斜杠被替换为下划线,Windows 目录被替换为“%SystemRoot%”。例如,如果初始 window 标题是 "Spam\Eggs",它会在 "HKCU\Console\Spam_Eggs" 下查找设置。使用控制台的 Alt+Space [P]roperties 对话框可以在 GUI 中配置这些属性。
可以设置的属性之一是名为 "CodePage" 的 DWORD
值。这是输入和输出的初始遗留代码页。 (我说 "legacy" 因为控制台有一个 Unicode API,应该始终是首选。)如果未设置,控制台默认为 OEM 代码页(例如西欧的 850 或 U.S.)。 LNK 快捷方式还可以在其 ConsoleFEDataBlock 中设置自定义代码页,但无法使用 GUI 或什至使用 IShellLink
COM 接口修改它。
例如,如果 cmd.exe 是 运行 直接来自 Win+R 运行 对话框而不是使用快捷方式,它使用默认的 window 标题 "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。