情况如下图:
分析:
当右下角编码为utf-8时,在内部终端中可以正确输出printf中的内容,却无法正确输出scanf读取的内容
原理:
https://bbs.csdn.net/topics/398436034按照这一篇来讲,就是文件编码和终端编码不统一造成的问题.
说白了就是scanf读取的时候实际上是以gbk编码读取的,printf的时候却是以utf-8输出,两者不统一就乱码了
所以问题在于,内部终端的字符集是65001 utf-8,如何修改成936或者如何scanf的时候将数据直接以utf-8读取.
核心:
第一句scanf的printf的编码取决于终端编码,第二句printf的编码取决于文件编码
scanf录入的编码始终是gbk,因此只有终端是gbk时候才能正确printf中文
而第二局句printf的编码使用与文件编码相同,所以当文件编码和终端相同时,不管都是gbk还是utf-8都会输出正确内容提一嘴,为什么外部终端可以scanf中文,原因是外部终端的编码本身就是936 gbk编码
用有没有什么办法可以将内部终端也修改成936呢?有!
解决方法
1.直接在终端中输入chcp 936然后回车
这个方法可以短暂修改终端的字符编码,但如果使用launch和task等配置文件运行代码就会重置字符集.因此要想用这个方法运行代码只能用code runner这个插件来右击运行
2.在代码中手动设定内部终端编码的字符集,如下:
#include <stdio.h>
#include <windows.h>
int main()
{
SetConsoleOutputCP(936);
SetConsoleCP(936);
//手动设置字符集,从头文件windows.h调用
char a[100];
scanf("%s", a);
printf("%s\n", a);
printf("why??????可以吗?\n");
return 0;
}
重点: 由于手动将终端设置为gbk编码,于是右下角的文件编码也需要改成gbk,否则第二句printf乱码
缺点很明显,和用clion一样每次都得多打个东西很难受,强迫症打咩!
3........我哪知道啊,求个大神教一下怎么改内部终端默认编码字符集
什么都尝试过了,设置里面搜索encoding不管是utf-8还是gbk一点影响都没有
关于右下角的文件编码的作用我在核心中提到了,对终端编码没影响的
最后
为什么我用c++写的代码看起来很C,是因为我目前是一名大二软件工程的学生,这学期在上数据结构(C语言),由于用到了引用,便在C++的环境运行代码,勿喷