Windows下控制台应用程序乱码解决方案
1、首先,我们要明白乱码的原因。原因肯定是编码与解码不一致导致的,我们先来看看编码与解码的情况。
打开命令提示符窗口,在标题栏上右键,属性。
2、在打开的属性窗口中,选择选项标签页,可以看到当前代码页组框中有“936 (ANSI/OEM -简体中文 GBK)”的字样,很明显命令提示符的解码方式是GBK。
3、再来看看源代码main.cpp的编码。可以在记事本的另存为对话框中看到,编码是UTF-8的方式。而且我的QtCreator的默认解码方式也是UTF-8,所以能够正确解码,否则源代码也会是乱码。
4、来看看编译运行的情况。源代码中的“你好,C++!”已经变成火星文了,不知道怎么打火星文的童鞋有福了。
5、既然是编码的问题,当然从编码入手了。我们把源代码的编码方式改了不就行了。
用记事本打开main.cpp,然后打开另存为对话框,对话框的下方的编码我们选择ANSI。然后确定覆盖原来的main.cpp。
6、这时候我们的QtCreator不乐意了,弹出了个对话框。
意思是,源代码在外部被改写,要不要重新载入,选择Yes to All。
7、这时候又出现问题了,窗体顶部弹出个条,提示我们无法用UTF-8解码main.cpp。当然不能用UTF-8了,因为我们把它转换成了ANSI。而且,源代码中的汉字也变成了一团不知道是啥的东西。
8、点击那个条上的 Select Encoding 。我们选择GBK那行,然后点击按编码重新载入。之后一切又都好了。
9、再运行下看看。
好了,运行正常。对于强迫症者来说,感觉呼吸都轻松多了。
1、一个项目可能有很多文件,那么每一个都这么改还真的是很麻烦。有没有更简单的方法呢?这就是我们的方法二。实际上CMD有个命令chcp可以修改命令提示符的解码方式。我们来试试看。
打开一个命令提示符窗口,输入chcp 65001。65001就是UTF-8。
2、可以看到,命令提示符确实是变成了UTF-8。
好的,我们把源代码用记事本再次的转换为UTF-8,然后再运行看看情况。
可是我们发现,我们的程序依然是乱码。而且,程序窗口的解码方式并没有变。这可如何是好。
3、没关系,不知道你知不知道C语言有个库叫stdlib.h的,可以通过system()函数调用各命令的。那我们就在程序运行的时候调用命令来改解码方式。
代码如下:
#include <iostream>
#include <cstdlib>using namespace std;int main()
{
system("chcp 65001");
system("cls");
cout<<"你好,C++!"<<endl;
return 0;
}
我们来看看运行情况
4、已经可以看到正常的汉字了,除了“你”没有显示以外,其他的看起来都还不错。
注意:如果你的仍然是乱码。你可以试着在命令提示的属性窗口中,字体标签页,将字体改为 Lucida console,然后再试试。
至于为什么“你”字没法正常显示,我猜测是因为BOM的问题。先不管这个问题了,我们在“你”前面加几个空格就行了。
再来运行看看。
好了,问题解决了。空气又变的清新了。
1、虽然,加两行代码能解决问题,而且也方便了很多。但是无缘无故加两行代码,对于强迫症来说是有点难受的。而且据说system()无法跨平台使用,这个也是不太好的。
我们来看看终极大杀器,一劳永逸解决问题。
修改注册表配置。
打开注册表,找到路径:HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe
将右侧的CodePage的值修改为65001。我们甚至可以改字体的大小。
2、有童鞋可能看到了另一个注册表项,而且看起来很熟悉,我们也顺便把它的值改一改吧。
3、我们将
system("chcp 65001");
system("cls");
这两行代码注释掉,然后再运行代码看看。
没有问题了。
我以后都没有问题了,耶!