VS2015中使用cout输出中文全是?,而使用printf输出中文就能正常显示。

flychildc 2018-12-22 06:23:55
问题如题,我的源代码是GB2312格式的,控制台是GBK的,按道理输出中文不会出问题,可是我用cout输出中文发现全是?,试了下printf输出中文就能正常显示。

运行结果:

调试的时候发现str存的全是?:

论坛那位大佬能指点下迷津
...全文
3357 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
光速抠觉 2019-03-22
  • 打赏
  • 举报
回复
打开控制台窗口右键,属性里有个使用旧控制台设置,就不会有乱码了,亲测有效,应该是vs自己的问题
  • 打赏
  • 举报
回复
应该是编码问题,点击项目设置,编码改为utf-8
何以问天涯 2019-01-19
  • 打赏
  • 举报
回复
怎么将控制台换为旧版控制台,?
赵4老师 2018-12-26
  • 打赏
  • 举报
回复
Windows10自动更新不得人心。
  • 打赏
  • 举报
回复
引用 40 楼 qq_41131210 的回复:
要不试一下将控制台换为旧版控制台, 在控制台的属性里面设置, 更改的是全部控制台. 我更新了win1809之后也出现了这样的问题


我改了之后成功了,不知道是为啥,搞了一周多了
  • 打赏
  • 举报
回复
引用 40 楼 qq_41131210 的回复:
要不试一下将控制台换为旧版控制台, 在控制台的属性里面设置, 更改的是全部控制台. 我更新了win1809之后也出现了这样的问题


你按这个方法成功了?
  • 打赏
  • 举报
回复
引用 37 楼 flychildc 的回复:
[quote=引用 36 楼 shs1992shs 的回复:]
应该就是编码解码的问题,昨天找出了问题所在,就是编译时编码出现了问题,我的源代码被改成了windows-1252字符集,而以前的都是GB2312字符集,所以一编译运行以前的代码就会被编成windows-1252,用notepad打开看,汉字都成了乱码字符,所以控制台显示一直为问号。就是这个windows-1252字符的问题




然后我今天重装了系统,重新装了VS,然后现在源程序编译后,有时候是GB2312,有时候又是windows-1252了,好像是中文字符串出现就变成windows-1252,我也不知道怎么解决了,感觉搞不了了,决定用英文代替了

你是说代码在VS中编译之后源码的编码格式发生了改变吗?[/quote]

是的了,高级保存选项保存为GB2312,但是没有保存成功,可能是内部的编码逻辑出了问题,暂时还不知道问题的bug出现在哪
CBL1999 2018-12-26
  • 打赏
  • 举报
回复
要不试一下将控制台换为旧版控制台, 在控制台的属性里面设置, 更改的是全部控制台. 我更新了win1809之后也出现了这样的问题
flychildc 2018-12-26
  • 打赏
  • 举报
回复
引用 35 楼 赵4老师 的回复:
有可能是控制台的默认代码页问题。
system("chcp 65001");
是要把控制台设置成utf-8编码吗?这一句加在程序开头吗?我把这句加在开头后面都没法输出了。我的控制台默认是GBK的,源代码是GB2312的,编码格式是一致的,应该不用把控制台设置成utf-8吧。
flychildc 2018-12-26
  • 打赏
  • 举报
回复
引用 36 楼 shs1992shs 的回复:
应该就是编码解码的问题,昨天找出了问题所在,就是编译时编码出现了问题,我的源代码被改成了windows-1252字符集,而以前的都是GB2312字符集,所以一编译运行以前的代码就会被编成windows-1252,用notepad打开看,汉字都成了乱码字符,所以控制台显示一直为问号。就是这个windows-1252字符的问题 然后我今天重装了系统,重新装了VS,然后现在源程序编译后,有时候是GB2312,有时候又是windows-1252了,好像是中文字符串出现就变成windows-1252,我也不知道怎么解决了,感觉搞不了了,决定用英文代替了
你是说代码在VS中编译之后源码的编码格式发生了改变吗?
flychildc 2018-12-26
  • 打赏
  • 举报
回复
感谢论坛大佬们的解答,第一次发帖这么多人解答,真的非常感激!问题解决方法参考40楼大兄弟:
引用 40 楼 qq_41131210 的回复:
要不试一下将控制台换为旧版控制台, 在控制台的属性里面设置, 更改的是全部控制台. 我更新了win1809之后也出现了这样的问题
flychildc 2018-12-26
  • 打赏
  • 举报
回复
引用 40 楼 qq_41131210 的回复:
要不试一下将控制台换为旧版控制台, 在控制台的属性里面设置, 更改的是全部控制台. 我更新了win1809之后也出现了这样的问题
原来问题出在这
_ZGq 2018-12-25
  • 打赏
  • 举报
回复
引用
用wcout是能正常输出,我现在想搞清楚为什么cout突然就不行了,问题出在哪

'w'是宽的意思,比如有一个类型叫做wchar_t,中的w就是这个意思。wcout/wcin/wcerr/wclog就是用来输出宽的数据(一般来说是字符,就是上面提到的wchar_t,宽字符最大值最少为2^16-1)。
cungudafa 2018-12-25
  • 打赏
  • 举报
回复
看看这个,运行测试一下:#include<stdio.h> void main(void) { unsigned char temp[4]; scanf("%s",temp); printf("机内码高字节是0x%.2x\n",temp[0]); printf("机内码低字节是0x%.2x\n",temp[1]); printf("区位码区码是%2d\n",temp[0]-0xa0); printf("区位码位码是%2d\n",temp[1]-0xa0); printf("国际码高字节是0x%.2x\n",temp[0]-0x80); printf("国际码低字节是0x%.2x\n",temp[1]-0x80); }
flychildc 2018-12-25
  • 打赏
  • 举报
回复
引用 31 楼 赵4老师 的回复:
wcout.imbue(locale("chs"));
wcout<<L"汉字"<<endl;
用wcout是能正常输出,我现在想搞清楚为什么cout突然就不行了,问题出在哪
赵4老师 2018-12-25
  • 打赏
  • 举报
回复
wcout.imbue(locale("chs"));
wcout<<L"汉字"<<endl;
flychildc 2018-12-25
  • 打赏
  • 举报
回复
引用 25 楼 cungudafa 的回复:
看看这个,运行测试一下:#include<stdio.h> void main(void) { unsigned char temp[4]; scanf("%s",temp); printf("机内码高字节是0x%.2x\n",temp[0]); printf("机内码低字节是0x%.2x\n",temp[1]); printf("区位码区码是%2d\n",temp[0]-0xa0); printf("区位码位码是%2d\n",temp[1]-0xa0); printf("国际码高字节是0x%.2x\n",temp[0]-0x80); printf("国际码低字节是0x%.2x\n",temp[1]-0x80); } 按照你给的代码运行了下,结果如下
flychildc 2018-12-25
  • 打赏
  • 举报
回复
引用 24 楼 wyy_CSDN? 的回复:
那项目属性里的设置是啥?多字节字符集?还是Unicode字符集 换一下试试
unicode和多字符集我都试过了,都会乱码
flychildc 2018-12-25
  • 打赏
  • 举报
回复
引用 27 楼 赵4老师 的回复:
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
嗯,用printf打印中文正常输出,说明文件保存的编码方式和控制台的编码方式是一致的。在网上看到有人说cout好像也有自己的字符集,那就可能是cout出问题了,但是一直没查到相关资料。。。
赵4老师 2018-12-25
  • 打赏
  • 举报
回复
对电脑而言没有乱码,只有二进制字节;对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
加载更多回复(26)

24,852

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧