将Windows控制台的默认代码页更改为UTF-8


120

当前,我正在运行Windows 7 x64,通常我希望所有控制台工具都可以与UTF-8一起使用,而不是与默认代码页850一起使用。

chcp 65001使用任何工具之前在命令提示符下运行都会有所帮助,但是是否有任何方法可以将其设置为默认代码页?

更新:

更改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP值以65001使我无法启动系统。

建议将更HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun改为@chcp 65001>nul对我的目的非常有用。(感谢Ole_Brun


请注意,有针对性的解决方案可能会破坏Windows的find.exe(这会导致Android SDK生成问题):superuser.com/questions/176737/…–
J Rao

嗯,当我使用chcp 65001进行目录操作时,控制台窗口会崩溃,但是使用/ u标志启动cmd.exe会有所帮助(nb:它确实使用unicode,因为它未反映在chcp.com输出中)
eckes

10
如果将编码设置为不受支持的多字节代码页(例如65001),则Windows控制台上将布满bug。任何使用Win32 WriteFile / ReadFile API输出计数的软件都将得到错误的结果,因此,像MSVCRT那样在此基础上进行构建遇到非ASCII时,stdlib的实现将产生错误的/重复的输出并挂在输入上。在MS修复它之前(至今已有数十年没有迹象表明),将控制台代码页全局更改为65001是一个非常糟糕的主意
bobince

2
AWindows功能版本的任何使用均已中断。 需要移植所有代码才能使用W版本。
Demi

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP用作非unicode(non-utf)环境的后备,很明显,您试图将其强制为“ unicode”,因为您认为它在定义上存在争议。Windows挂起可能是因为某些系统启动时依赖非Unicode字符集来工作。
venimus

Answers:


97

要仅更改控制台的代码页,请执行以下操作:

  1. 开始->运行-> regedit
  2. [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun]
  3. 将值更改为 chcp 65001

1
@Regent在问题中,您提到的对您有用的注册表值为@chcp 65001>nul,而在此接受的答案中为chcp 65001。两者之间有什么区别?
galacticninja

7
@galacticninja简单地放置chcp 65001将导致每个打开的命令提示符打印“活动代码页:65001”,同时@chcp 65001>nul将阻止任何输出。
摄政王

7
AutorunWindows 8.1下不提供给我。
kleinfreund 2015年

2
@kleinfreund @Luke:如果Autorun不存在,则可以添加一个 字符串值,其内容为@chcp 65001>nul
Dacto

1
@ Dr.jacky不确定确切的含义意味着危险。我刚刚回答了OP的问题。是否应该这样做是另一个问题。我认为Python可能存在一些问题,因此您可能希望至少在将代码页设置为65001之前进行检查。
尼尔斯·马格纳·伦德

37

就个人而言,我不喜欢更改注册表。这会引起很多问题。我创建了一个批处理文件:

@ECHO OFF
REM change CHCP to UTF-8
CHCP 65001
CLS

我保存C:\Windows\System32为switch.bat。

我在桌面上为cmd.exe创建了一个链接。

在cmd快捷方式的属性中,将目标更改为: C:\Windows\System32\cmd.exe /k switch

Voilá,当我需要输入UTF-8时,我使用此链接。


7
请注意它将打印Active code page: 65001到标准输出。因此,如果您正在执行类似的操作,CHCP 65001 && mycommand.exe则将在一开始就将代码页打印出来。您需要CHCP 65001 >nul && mycommand.exe
frumbert 2015年

32

注册表文件:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"CodePage"=dword:fde9
  1. 值必须为十六进制
  2. 必须完全按原样包含顶行
  3. HKEY_CURRENT_USER不能缩写
  4. dword不能省略

命令提示符:

REG ADD HKCU\Console\%SystemRoot^%_system32_cmd.exe /v CodePage /t REG_DWORD /d 65001
  1. 值可以是十进制或十六进制
  2. %SystemRoot%必须转义
  3. REG_DWORD不能省略

电源外壳:

New-Item -ErrorAction Ignore HKCU:\Console\%SystemRoot%_system32_cmd.exe
Set-ItemProperty HKCU:\Console\%SystemRoot%_system32_cmd.exe CodePage 65001
  1. 值可以是十进制或十六进制
  2. -Type DWord 假定使用PowerShell 3+
  3. 可以使用 ni -> New-Item
  4. 可以使用 sp -> Set-ItemProperty
  5. 可以使用 -ea 0 -> -ErrorAction Ignore

Cygwin的:

regtool add '\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe'
regtool set '\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe\CodePage' 65001
  1. 值可以是十进制或十六进制
  2. 可以使用 / -> \
  3. 可以使用 HKCU -> HKEY_CURRENT_USER
  4. 可以使用 user -> HKEY_CURRENT_USER

在Windows 10中不起作用。起作用的是创建一个自动运行,该运行通过chcp命令设置代码页。例如
George

我要说的是,chcp 65001在不小心地使编辑超时之前,是在自动运行命令文件中发布了。参见stackoverflow.com/a/17405182/315083
乔治

事实是,它仅适用于CMD,不适用于控制台本身。
AnrDaemon

5

更改代码页的命令是chcp <codepage>。范例:chcp 1252。您应该在Powershell窗口中键入它。为了避免每次都键入代码的麻烦(如果您始终需要更改代码页),可以将其附加到程序的命令行中。这样做,请按照下列步骤操作:

  1. 右键单击“开始”菜单上的Powershell图标,然后选择“更多”>“打开文件位置”。
  2. 右键单击Powershell快捷方式,然后选择“属性”。
  3. 将以下内容添加到“目标”命令行的末尾: -NoExit -Command "chcp 1252"

要开心。除非您没有其他选择,否则请不要大惊小怪。


这个对我来说很完美。-NoExit -Command "chcp 1252 > null"开头也忽略了有关所选代码页的消息。
CodeMonkey

5

这可以通过创建PowerShell配置文件并向其添加命令“ chcp 65001> $ null”来完成:

PS> Set-ExecutionPolicy RemoteSigned
PS> New-Item -Path $Profile -ItemType file -Force
PS> notepad $Profile

这不需要编辑注册表,并且与编辑快捷方式不同,如果使用Windows资源管理器上下文菜单在特定文件夹中启动PowerShell,则可以正常工作。


1
@PimpJuiceIT,不。请参阅此答案的第一行。
Dacto

3

在Windows 10的1809版本中,我设法通过转到系统的Language settings,选择Administrative language settings,单击Change system locale...并选中Beta: Use Unicode UTF-8 for worldwide language support复选框,然后重新启动我的计算机,来永久解决此问题。

这样,它适用于所有应用程序,甚至包括那些我不是从命令提示符启动的应用程序!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.