当前,我正在运行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/…

使用UTF-8代码页还会中断more命令(它会提供误导性的错误消息“内存不足”。)使用/ U开关打开命令提示符无济于事。

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

Windows功能的A版本的任何使用都已中断。所有代码都需要移植才能使用W版本。

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

#1 楼

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

开始->运行-> regedit
转到[HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun]

将值更改为@chcp 65001>nul


如果不存在Autorun,则可以添加New String

评论


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

–银河忍者
15年3月16日在8:41

@galacticninja只需将chcp 65001放入,将使每个打开的命令提示符都打印“活动代码页:65001”,而@chcp 65001> nul将阻止任何输出。

–摄政王
15年3月26日在15:51

Windows 8.1下没有自动运行功能。

– kleinfreund
2015年5月10日在9:09

@kleinfreund @Luke:如果不存在自动运行,则可以添加一个新字符串值,其内容为@chcp 65001> nul

– Dacto
18-10-23在20:45

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

–尼尔斯·玛格妮·伦德(Nils Magne Lunde)
18/12/18在6:59

#2 楼

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

@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时,请使用此链接。

评论


请注意它将打印活动代码页:65001到标准输出。因此,如果您正在执行CHCP 65001 && mycommand.exe之类的操作,则将在开始时打印出代码页。您需要CHCP 65001> nul && mycommand.exe

– frumbert
2015年6月12日在5:33



#3 楼

编辑注册表:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"OEMCP"="65001"

然后重新启动。通过此修复程序,如果您使用Consolas字体,似乎可以将PowerShell锁定为较小的字体。 cmd.exe仍然可以正常工作。解决方法,
您可以使用Lucida控制台,或者我改用Cascadia Mono:
https://github.com/microsoft/cascadia-code

评论


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

– AnrDaemon
19年9月6日在9:10

#4 楼

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

这种方式适用所有应用程序,甚至是那些我不是从命令提示符启动的应用程序!
(这对我来说是必需的,因为我试图从Atom中编辑Agda代码。)

评论


谢谢,它解决了我的问题!

–贾巴
20-2-22在10:09

这是现代Windows的最佳和正确答案。

– CAD97
20年4月1日在21:06

这无疑为我完成了工作。但是,它有一个令人讨厌的副作用:QuickBooks(我使用2017年专业版)突然无法识别我的任何帐户名,因为它们包含Unicode字符,并且此设置确实使该软件搞砸了。单挑...

–迈克·艾伦(Mike Allen)
20 Apr 15'在18:42

嗯,系统必须已经习惯了这些名称或类似名称的简化版本。从来没有想过这会在修复其他问题时会破坏东西,但是我想您永远都无法做出改变而不弄乱某些东西。 🙃(xkcd.com/1172)感谢您提供的信息,我希望其他人不会遇到这种情况,但至少现在他们可以做好准备。

–Isti115
20-4-15在19:24



#5 楼

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

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


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

评论


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

– Dacto
18/12/14在17:21

#6 楼

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


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


请开心。
不要大惊小怪Windows注册表,除非您没有其他选择。

评论


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

– CodeMonkey
18年8月3日在8:53



#7 楼

如果您使用的是ConEmu,则:


从右上方菜单中打开设置
转到“启动->环境”
在新行上添加chcp 65001
单击“保存设置”。
关闭ConEmu并重新打开它