CMD/DOS窗口出现中文乱码及解决方案(以下演示是在Win10系统),本文提供了多种解决方案,总有一款适合你。
有时候我们在cmd窗口执行命令或程序时,会看到cmd窗口出现中文乱码的问题
这主要是因为cmd窗口默认使用的是GBK编码,如果命令或程序输出的内容编码与cmd窗口使用的编码不一致,就会出现中文乱码的问题
解决方案主要有两大类:
1.更改DOS窗口代码页;
2.更改批处理文件编码;
如何查看当前窗口的代码页?
方式1:在dos窗口顶部右键菜单
> 属性
> 选项
tab页 > 当前代码页
方式2:在dos窗口输入chcp
命令查看
C:\Users\cyinl>chcp /? 显示或设置活动代码页编号。 CHCP [nnn] nnn 指定代码页编号。 不带参数键入 CHCP 以显示活动代码页编号。
(部分)代码页编号如下:
代码页 描述 65001 UTF-8 编码 950 繁体中文 936 简体中文 GBK (默认) 437 MS-DOS 美国英语
如何更改dos窗口代码页?
更改dos窗口代码页又分为多种方式,每种方式各有优缺点。
在dos窗口 执行chcp 65001
更改dos窗口代码页
优点:切换代码页灵活,可以将chcp命令放到bat批处理文件内,临时更改控制台窗口的编码格式
缺点:仅对当前窗口生效的,其他窗口或新打开的dos窗口仍为默认的936
C:\Users\cyinl>chcp 65001
Active code page: 65001
C:\Users\cyinl>
验证,执行curl www.baidu.com
,可以看到中文乱码问题解决了
CodePage
项(永久有效)1)win+r
打开运行器,输入regedit
回车,打开注册表;
2)在路径计算机\HKEY_CURRENT_USER\Console\%SystemRoot%_System32_cmd.exe
找到CodePage
项(没有的话新建一个,DWORD类型);
3)修改CodePage
的值为:十进制65001
(对应十六进制:fde9
)保存即可
优点:一劳永逸
缺点:通过.lnk 快捷方式打开的dos窗口,默认仍是 936(就很奇怪)
对通过Win+R
打开运行,输入cmd
回车,打开的cmd窗口,进行验证
对通过文件资源管理器
,地址栏输入cmd
回车,打开的cmd窗口,进行验证
对双击C:\WINDOWS\System32\cmd.exe
,打开的cmd窗口,进行验证
对开始菜单>Windows 系统>命令提示符
或搜索>输入cmd>命令提示符
打开的cmd窗口,进行验证
对执行bat批处理文件打开的cmd窗口,进行验证
test.bat
测试文件
@echo on
chcp
pause
注:开始菜单或搜索栏里打开的dos窗口,实际上是通过 xxx.lnk 快捷方式打开的
1)找到C:\Windows\System32\cmd.exe
命令程序;
2)右键cmd.exe
> 发送到
>桌面快捷方式
,创建一个cmd的快捷方式 cmd.exe - 快捷方式.lnk
3)桌面找到cmd的快捷图标,右键 > 属性
> 快捷方式
> 目标
后边增加 /K "chcp 65001"
(注意跟 cmd.exe 之间有个空格),然后点击应用
即可
优点:对 xxx.lnk 打开的dos窗口有效,可以弥补【方式2】注册表的CodePage 注册项对 .lnk 快捷方式打开的dos窗口不生效的不足
缺点:仅对修改的快捷方式的打开的dos窗口有效,如果有多个.lnk 快捷方式,需要分别进行修改
回到桌面双击cmd.exe - 快捷方式.lnk
,打开dos窗口,验证效果如下:
从 开始菜单>Windows 系统>命令提示符
或搜索>输入cmd>命令提示符
打开的dos窗口,进行验证,可以看到未生效
想要开始菜单
或搜索
里打开的dos窗口也生效,需要修改对应的 .lnk 里的属性
操作步骤:
1)开始菜单
或搜索
里找到命令提示符
,右键
> 打开文件位置
(我这里是C:\Users\cyinl\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\System Tools
)
2)找到命令提示符
快捷方式,右键
>属性
>快捷方式
>目标
后边增加 /K "chcp 65001",
点击应用
即可
从开始菜单
或搜索
打开dos窗口,进行验证,可以看到已生效
1)win+r
打开运行器,输入regedit
回车,打开注册表;
2)在路径计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
,右键 > 新建 > 字符串值,重命名为AutoRun
项;
3)双击AutoRun
,编辑数值数据为:chcp 937
(注意这里我为了区分其他方式更改的效果,设置为了937)
优点:一劳永逸,且对所有途径打开的cmd都生效
缺点:命令行启动后首行显示的不再是Windows版权信息,而是"Active code page: xxx"(好像也不算什么缺点);另外就是对于快捷方式来说【属性】配置后执行于【AutoRun】的配置,后执行的会覆盖先执行的(这点应该难理解吧)
对通过Win+R
运行cmd
打开的dos窗口进行验证如下,可以看到 AutoRun
配置已生效。
注意:【方式2】修改的注册表CodePage项,我并没有去掉,说明 AutoRun 配置覆盖掉了 CodePage 配置
双击桌面的cmd.exe - 快捷方式.lnk
图标,验证效果如下,可以看到注册表里的AutoRun
配置已生效,但是紧接着被其他配置给覆盖了,最终代码页显示为 65001
注意:目前 cmd.exe - 快捷方式.lnk 有3处配置,结合上边的 AutoRun 配置会覆盖 CodePage,可以推测出,这里的 65001 是 快捷方式的【属性】配置起的作用
把cmd.exe - 快捷方式.lnk
属性里的 /K "chcp 65001" 去掉
,然后重新打开dos窗口,验证上边的推测,从结果看 AutoRun 配置最终生效了(严格来讲是都生效了,只是后执行的会覆盖先执行的)
对开始菜单>Windows 系统>命令提示符
或搜索>输入cmd>命令提示符
打开的dos窗口,进行验证。
注意:对于【开始菜单】或【搜索】打开的命令提示符,共有【方式2】【方式3】【方式4】3个配置,结合验证结果可以看出快捷方式【属性】配置最终生效了
对执行bat批处理文件test,bat,打开的dos窗口,进行验证。
注意:对于批处理文件,此时只有【方式2】【方式4】两处配置,可以看出【方式4】的AutoRun配置最终生效了
最后结论:
配置优先级 【快捷方式的属性】>【注册表的AutoRun】>【注册表的CodePage】,即 高优先级配置会覆盖低优先级配置(严格来讲这里说的优先级高,只是因为它后执行,把先执行的效果给覆盖掉了)
通过更改批处理文件的编码方式,使文件的编码与DOS窗口的代码页对应
使用记事本,新建test2.bat
批处理文件,内容如下,另存为,编码选择:ANSI
@echo on
echo 中文
pause
双击test2.bat
批处理文件,执行效果如下:
是乱码没错,这是因为在前面演示过程中更改的AutoRun
配置将dos窗口代码页设置为了437
到注册表里把AutoRun
项删掉(这里就不演示怎么删了),然后再双击运行test2.bat
还是乱码,那就对了,聪明如你应该能想到,注册表里还有个CodePage
配置,配置的是:十进制 65001(对应 UTF-8),修改为 十进制 936(对应 ANSI/GBK)或删掉它!(不要问我怎么操作?我不会告诉你的!)
我这里改为936(我注册表里最初配置的就是936,这里相当于复原),再双击运行test2.bat
,中文乱码问题解决了
当然,你也可以在批处理文件里,在中文输出命令之前,使用chcp 更改dos窗口的代码页,使其与批处理文件的编码对应
使用记事本,新建test3.bat
批处理文件,内容如下,另存为,编码选择:ANSI@echo on chcp 936 echo 中文 pause
如果批处理文件保存时,编码选择:UTF-8,那么需要更改dos窗口的代码页为:65001,这里就不演示了。
总之就是保持批处理文件本身的编码方式与DOS窗口代码页对应,这样应该就不会出现乱码问题了