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

标签 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 之后,cmd.exe 的默认 CP 也是 still 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”中。使用控制台的 Alt+Space [D]efaults 对话框可以在 GUI 中配置此键中的大部分属性。

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

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

可以设置的属性之一是名为“CodePage”的 DWORD 值。这是输入和输出的初始遗留代码页。 (我说“传统”是因为控制台有一个应该始终首选的 Unicode API。)如果未设置,控制台默认为 OEM 代码页(例如西欧的 850 或美国的 437)。 LNK 快捷方式还可以在其 ConsoleFEDataBlock 中设置自定义代码页。 , 但使用 GUI 或什至使用 IShellLink COM 接口(interface)是不可能修改它的。

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

不幸的是,如果我们想要更改所有控制台应用程序的初始代码页,我们会感到失望,因为在“HKCU\Console”中设置它不起作用。由于控制台中的一个错误(目前由 conhostv2.dll 实现,它托管在 conhost.exe 中),如果我们在“HKCU\Console”中设置一个默认的“CodePage”值,控制台只会在加载和加载时短暂地设置这个值然后将自身重置为 OEM。

关于windows - 如果我的 OEMCP 设置为 437 那么为什么我的 cmd.exe 默认代码页是 932?我该如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47147050/

相关文章:

sql-server - 从 SQL Server 2008 R2 Express 升级到 SQL Server 2008 R2 Enterprise

powershell - 如何在一个命令中使用 'dir' 到不同的文件夹?

python - 从 python 执行程序,以便它在单独的 cmd.exe 窗口中打开

windows - 在 bat 文件上调整命令提示符

c++ - 错误 RC2255 : named STRINGTABLEs are not allowed - occurs when generating a Japanese RES file

windows - 在 Windows C++ 控制台应用程序中使用 wchar_t/wmain 有意义吗?

Windows 服务正在运行但事件日志不工作

windows - TortoiseSVN 删除实际存在的文件的状态

C# ESC/POS 打印越南语

windows - Windows 上的引脚处理器 CPU 隔离