jellycatbean 2024-03-08 12:44 采纳率: 0%
浏览 86

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 12: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的支持更为全面和完善。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月8日