前言:
主要解决三个问题:
1、初学C++的时候,用控制台输出,发现运行到控制台的中文文字和字符全部变成了乱码。为什么呢?这种情况应该怎么解决?
2、编辑器把我们想要输出的内容用UTF-8的方式进行编码进行传输,而控制台收到二进制数据流后用GBK的那一套方式进行解码对应,中文对应不上会出现了乱码,那英文为什么没有变成乱码呢?
3、我们修改完的控制台输出代码页的编码格式后,我们又发现疑问,为什么“请按任意键继续...”变成了英文呢?
情景1:
我在初学C++的时候遇到一个问题,当我在VScode编辑器用代码 cout << "计算机基础不牢,编程地动山摇!" 进行控制台输出的时候,发现运行到控制台的中文文字和字符全部变成了乱码。为什么呢?这种情况应该怎么解决?
原因:
其实就是编辑器和控制台输出代码页的编码格式不一致的问题,下面介绍了乱码形成的原因。
编辑器的编码方式:
其实直接修改编辑器的编码方式,改成GBK也可以,但是这样的编码方式不够通用,UTF-8的兼容性更好。
控制台输出代码页的编码方式:
右键控制台的上边框,可以在选项里面查看当前代码页的编码方式。
编码解码的工作原理:
“中”字用UTF-8编码后的二进制数字和用GBK编码后的二进制数字是不一样的,用UTF-8编码后的二进制数字11100100 10111000 10101101,用GBK编码后的二进制数字是11010110 11010000。下面这个网站有中文字符经过UTF-8和GBK编码后的二进制数字(为了方便记录把二进制转化成了十六进制显示)。中文字符UTF-8与GBK编码对照表 (gitee.io)
当我们在编辑器上输入“中”字时,编码器会用UTF-8的编码方式,把“中”字编码成对应的二进制数字11100100 10111000 10101101储存起来。然后计算机执行cout函数后,把这些UTF-8编码后的二进制数据流传送给控制台,控制台进行解码的时候用的是GBK解码方式,这样传过来的二进制数字11100100 10111000 10101101在对应GBK编码方式下的字符的时候,发现没有这个字符,于是就生成了乱码。
解决思路:
我最喜欢的一种解决措施就是把控制台输出代码页的编码方式给修改成UTF-8,这样由编辑器传过来的UTF-8编码后的二进制数字就能被控制台正确解码了。
解决措施:
在#include<windows.h>头文件中用“ SetConsoleOutputCP ( CP_UTF-8 ) ; ”函数,把控制台输出代码页修改成UTF-8编码格式。
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
// SetConsoleOutputCP ( CP_UTF8 ) ;
/*SetConsoleOutputCP ( ) 函数: 是一个Windows API函数调用,用于设置控制台输出代码页。
它指示控制台应该使用特定的代码页来显示输出,这样就可以在控制台中正确显示特定编码的文本。
注:CP是Code Page(代码页的缩写)*/
//CP_UTF8参数: 表示Unicode字符编码中的UTF-8格式。
cout << "Hello computer world!" << endl ;
cout << "我是二进制!" <<"但是我一点都不二!" << "很高兴认识你!" << endl ;
system("pause");
return 0;
}
修改后:
修改完我们也有了一个疑问,为什么“请按任意键继续...”变成了英文呢?这个问题我们将在情景3进行详细讨论。
情景2:
编辑器把我们想要输出的内容用UTF-8的方式进行编码进行传输,而控制台收到二进制数据流后用GBK的那一套方式进行解码对应,中文对应不上会出现了乱码,那英文为什么没有变成乱码呢?
原因:
因为英文无论是UTF-8还是GBK编码所对应的二进制数字是一样的,所以不受编码解码方式的影响。英文编码就是ASCII编码方式,而GBK和Unicode编码(进行优化后就是UTF-8编码)都兼容了ASCII编码方式,所以英文是不会出现乱码现象的。
情景3:
我们修改完的控制台输出代码页的编码格式化后,我们又发现疑问,为什么“请按任意键继续...”变成了英文呢?
原因:
因为“请按任意键继续...”这个字符是计算机传输的,计算机想要表达这个意思,会先检测控制台输出代码页的编码格式,如果是GBK编码格式,那计算机就给控制台输出代码页传送中文“请按任意键继续...”所对应的二进制数字;如果是UTF-8编码格式,那计算机就给控制台输出代码页传送英文“Press any key to continue...”所对应的二进制数字,这两个二进制数字肯定也是不一样的。又因为UTF-8能兼容世界上的所有字符,但是英语是受众最广的,所以在UTF-8编码格式的控制台输出代码页上就显示英文了。
版权归原作者 学二进制的一点都不二! 所有, 如有侵权,请联系我们删除。