jellycatbean 2024-03-08 04:44 采纳率: 0%
浏览 66

VisualStudio2022 C语言用函数从键盘上得到的中文再输出均为问号,直接用printf输出中文则无恙,该如何解决?

之前遇到过scanf函数报错的问题已经通过修改文件自动添加指令的方式解决了,但发现只要是scanf函数或getchar函数从键盘上得到中文,再输出就全是问号(如图1),英文或数字输出均正常(如图2),直接用printf函数输出中文也正常,想问问各位这是什么原因造成的,该如何解决

img


图1.从键盘得到中文再输出显示问号,直接用printf输出正常

img


图2.英文显示正常

关于尝试过的各种方法:
1.调整时区:调整为简体中文同时勾选了beta版本选项适应全球语言(图3),无效

img


图3.已更改语言选项

2.安装插件:下载forceutf-8 no/with bom 后连带英文同时会变成乱码,无效

3.修改高级保存选项中的编码项:目前选中的是65001,但除了utf-8相关项其余选项均为空白看不到名字(如图4),但能选中,选了后运行有的会报错有的不会,想找到gb2312试试但找不到,不知道空白项是和原因造成是否和题主诉求有关

img


图4.空白选项

5.修改vs语言项:目前已改为中文(如图5)但无效果,不知道在vs中还有没有能改的地方,如果有的话请大家指出

img


图5.修改语言区域为中文

6.修改注册表:在他人发的教程中的指定位置找不到codepage选项(如图6),想问问大家这个在何处,我该怎么尝试改改

img


图6.在currentuser/console位置下找不到codepage

感谢各位耐心看完,十分感激提出建议!

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-08 04:45
    关注

    引自免费微信小程序:皆我百晓生

    在Visual Studio 2022中使用C语言处理中文字符时,您遇到的问题可能是由于输入输出流的编码不匹配导致的。默认情况下,scanfprintf函数在处理字符串时可能不会自动按照UTF-8编码进行,而Windows控制台的默认编码通常是GBK或OEM编码。

    要解决这个问题,请尝试以下步骤:

    1. 设置控制台输出编码: 在代码开始处添加以下内容,强制设置控制台输出为UTF-8编码:

      #include <io.h>
      #include <fcntl.h>
      
      int main() {
          _setmode(_fileno(stdout), _O_U8TEXT); // 设置标准输出为UTF-8
      
          // 然后是你的scanf和printf语句
          // ...
      }
      
    2. 读取键盘输入的中文: 使用_getwch或者_getws(对于宽字符)代替scanf来读取中文输入,因为它们可以更好地处理多字节字符。例如:

      #include <stdio.h>
      #include <conio.h>
      
      int main() {
          _setmode(_fileno(stdout), _O_U8TEXT);
      
          wchar_t input[100];
          _getws(input);
          wprintf(L"%s\n", input); // 输出宽字符数组
      
          return 0;
      }
      
    3. 确保源文件编码为UTF-8无BOM: 确保您的源代码文件是以UTF-8无BOM格式保存的,这可以通过Visual Studio的“高级保存选项”来设置。

    4. 环境变量配置: 您也可以通过设置环境变量CHCP 65001来改变控制台窗口的代码页至UTF-8,但这通常需要在运行程序之前在命令行界面执行,或者在程序启动时设置:

      system("chcp 65001");
      

    但请注意,虽然上述方法可能在某些环境下工作,但C语言的标准库本身并不完全支持Unicode,所以对于复杂的Unicode文本处理,可能需要依赖其他库如 iconv 或者 Windows API 来进行转换操作。另外,直接修改注册表以达到全局设置的目的不是推荐的做法,因为它可能影响到其他应用程序的正常行为。如果以上方法仍不能解决问题,请考虑是否采用更现代的编程语言和框架,它们对Unicode的支持更为全面和完善。

    展开全部

    评论 编辑记录
  • 关注

    jellycatbean 中午好🌞🌞🌞
    本答案参考ChatGPT-3.5

    在Visual Studio 2022中,C语言通过scanfgetchar函数获取的中文输入无法正确显示的问题,原因在于控制台编码与输入输出流的编码不匹配。Windows控制台默认编码可能是GBK或其他非UTF-8编码,而你的源代码文件可能是UTF-8编码。

    解决方案:

    1. 设置控制台编码为UTF-8:

      • 在Visual Studio中,打开项目属性(右键单击项目 -> 属性)。
      • 转到“配置属性”->“常规”选项卡。
      • 找到并修改“字符集”设置为“使用多字节字符集 (/MBCS)”或尝试“使用Unicode字符集 (/U)”。

      或者在程序开始时设置控制台的输出编码:

      #include <io.h>
      #include <fcntl.h>
      
      int main() {
          _setmode(_fileno(stdout), _O_U8TEXT); // 设置控制台输出为UTF-8
          _setmode(_fileno(stdin), _O_U8TEXT); // 设置控制台输入为UTF-8
      
          char c;
          c = getchar();
          putchar(c);
          printf("\n今天天气不错%c\n", c);
      
          return 0;
      }
      
    2. 确保输入的字符串以UTF-8格式读取和处理: 使用fgetwcwprintf等宽字符版本的函数处理中文字符。

    3. 调整IDE环境设置:

      • 确认Visual Studio IDE本身的区域和语言设置已调整为中国简体,并且勾选了“Beta版:使用Unicode UTF-8提供全球语言支持(U)”。
      • 尝试在程序中加入#include <locale.h>头文件,并调用setlocale(LC_ALL, ".utf8")来设置正确的本地化环境。

    如果以上方法均无效,请查看项目特定的编译器命令行参数,确认是否有关于字符集或编码的特殊设置,并尝试调整这些设置使之与UTF-8兼容。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2024-03-08 06:09
    关注

    【相关推荐】




    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论
  • 2301_77124706 2024-07-09 06:00
    关注

    解决了没 我为啥也是这样

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部