问题描述
中文Windows自带的命令行程序默认都是使用的936代码页,也就是GBK的编码,因此当程序以UTF-8编码输出文本时,就会看到乱码:
该问题在自己写的C/C++程序中最常见,当源文件以UTF-8编码时,用
printf
、
std::cout
等方法打印出来的全都显示乱码,关于C/C++的编码问题可以参见
此前的一篇博客
。不仅如此,一些间接依赖于Windows原生命令行的程序也会产生乱码问题,例如VS Code的内置终端、Qt Creator等:
这个问题还会导致“字体”选项卡中没有多少选项,使得我们没法用自己安装的等宽字体,使得命令行用起来非常难受……
解决方案
要想从根本上解决问题,必须修改命令行的默认编码,其默认编码是默认跟随系统语言配置的,今天我终于在Windows的语言设置里找到了这个选项:
-
打开设置,进入语言页面:
-
点击“管理语言设置”,再点击对话框上的“更改系统区域设置”:
-
勾选下图中的选项:
-
重启电脑
,然后你就会神奇地发现CMD和Powershell的代码页都默认变为65001了!
注意事项
Stackoverflow上流传一种往注册表里写入
@chcp 65001
的方案,亲测这种办法没法解决根本问题,而且会导致原来不乱码的程序变乱码!
https://stackoverflow.com/questions/14109024/how-to-make-unicode-charset-in-cmd-exe-by-default
副作用
相信大家肯定能想到,既然有应用因为这项变动不乱码了,那么就会有应用因为这些改动乱码!
这些应用大多是国产的一些软件,它们使用Windows默认的编码输出汉字,所以当你改用UTF-8时,它们反而不好了!
目前已知的一款应用受此影响的是深信服的EasyConnect客户端,它连接成功的提示消息会变成乱码,不过不影响其它的正常使用:
如果有朋友发现了因此导致无法运行的应用,请在下面评论区指出。
考虑到这个副作用,那么到底换不换编码呢?这是一个权衡,得看你用的国产软件多不多、以及UTF-8的软件多不多了……或者说,看你是把自己定位为一个普通计算机用户还是软件开发者。
相关文献