Windows下控制台应用程序乱码解决方案
来源:网络收集 点击: 时间:2024-04-03首先,我们要明白乱码的原因。原因肯定是编码与解码不一致导致的,我们先来看看编码与解码的情况。
打开命令提示符窗口,在标题栏上右键,属性。

在打开的属性窗口中,选择选项标签页,可以看到当前代码页组框中有“936 (ANSI/OEM -简体中文 GBK)”的字样,很明显命令提示符的解码方式是GBK。

再来看看源代码main.cpp的编码。可以在记事本的另存为对话框中看到,编码是UTF-8的方式。而且我的QtCreator的默认解码方式也是UTF-8,所以能够正确解码,否则源代码也会是乱码。

来看看编译运行的情况。源代码中的“你好,C++!”已经变成火星文了,不知道怎么打火星文的童鞋有福了。

既然是编码的问题,当然从编码入手了。我们把源代码的编码方式改了不就行了。
用记事本打开main.cpp,然后打开另存为对话框,对话框的下方的编码我们选择ANSI。然后确定覆盖原来的main.cpp。

这时候我们的QtCreator不乐意了,弹出了个对话框。
意思是,源代码在外部被改写,要不要重新载入,选择Yes to All。

这时候又出现问题了,窗体顶部弹出个条,提示我们无法用UTF-8解码main.cpp。当然不能用UTF-8了,因为我们把它转换成了ANSI。而且,源代码中的汉字也变成了一团不知道是啥的东西。

点击那个条上的 Select Encoding 。我们选择GBK那行,然后点击按编码重新载入。之后一切又都好了。

再运行下看看。
好了,运行正常。对于强迫症者来说,感觉呼吸都轻松多了。

一个项目可能有很多文件,那么每一个都这么改还真的是很麻烦。有没有更简单的方法呢?这就是我们的方法二。实际上CMD有个命令chcp可以修改命令提示符的解码方式。我们来试试看。
打开一个命令提示符窗口,输入chcp 65001。65001就是UTF-8。

可以看到,命令提示符确实是变成了UTF-8。
好的,我们把源代码用记事本再次的转换为UTF-8,然后再运行看看情况。
可是我们发现,我们的程序依然是乱码。而且,程序窗口的解码方式并没有变。这可如何是好。

没关系,不知道你知不知道C语言有个库叫stdlib.h的,可以通过system()函数调用各命令的。那我们就在程序运行的时候调用命令来改解码方式。
代码如下:
#include iostream
#include cstdlibusing namespace std;int main()
{
system(chcp 65001);
system(cls);
cout你好,C++!endl;
return 0;
}
我们来看看运行情况

已经可以看到正常的汉字了,除了“你”没有显示以外,其他的看起来都还不错。
注意:如果你的仍然是乱码。你可以试着在命令提示的属性窗口中,字体标签页,将字体改为 Lucida console,然后再试试。
至于为什么“你”字没法正常显示,我猜测是因为BOM的问题。先不管这个问题了,我们在“你”前面加几个空格就行了。
再来运行看看。
好了,问题解决了。空气又变的清新了。

虽然,加两行代码能解决问题,而且也方便了很多。但是无缘无故加两行代码,对于强迫症来说是有点难受的。而且据说system()无法跨平台使用,这个也是不太好的。
我们来看看终极大杀器,一劳永逸解决问题。
修改注册表配置。
打开注册表,找到路径:HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe
将右侧的CodePage的值修改为65001。我们甚至可以改字体的大小。

有童鞋可能看到了另一个注册表项,而且看起来很熟悉,我们也顺便把它的值改一改吧。

我们将
system(chcp 65001);
system(cls);
这两行代码注释掉,然后再运行代码看看。
没有问题了。
我以后都没有问题了,耶!

关于字符编码是个很复杂的问题,感兴趣的童鞋可以研究研究
控制台乱码QT版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.1haoku.cn/art_415529.html