VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法

问题背景

在较长一段时间里,C/C++开发者所使用的集成开发环境(IDE)要么是比较重量级的VS(Visual Studio),要么是Codeblocks·、·Visual C++ 6.0等轻量级IDE,又或者是诸如notepad++、sublime text等文本编辑器+GCC编译器+命令行工具的组合式开发环境。这几种开发方式要么太过庞大比较吃硬件资源,比如VS动辄就要占用几十个G的硬盘空间,要么虽然轻量但是没有友好的代码提示和自动化的编译链接运行过程,开发体验并不是很友好。

近几年来,随着VSCode(Visual Studio Code)的流行,越来越多的开发者选择以此来作为个人的集成开发环境。使用VSCode开发C/C++程序可以下载安装VSCode官方的C/C++ for Visual Studio Code插件实现开发过程中的代码提示、调试、运行等功能,但是需要自行安装C/C++编译器,笔者是用的是GCC编译器MinGW。具体开发环境的搭建过程在此不作讲解,本文关注点在于开发过程中遇到的中文字符相关的乱码问题。

问题描述

测试代码
  1. 英文字符串文本文件 es_src.txt
Chinese
  1. 中文字符串文本文件 ch_src.txt
中文
  1. main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char str_es[] = "Chinese";
    char str_ch[] = "中文";
    char str[30];

    // 读英文字符串的文本文件测试
    printf("读文件测试:\n");
    FILE *fpr_es = fopen("es_src.txt", "r");
    while (fgets(str, 30, fpr_es) != NULL)
    {
        printf("strcmp(%s, %s)=%d\n", str_es, str, strcmp(str_es, str));
    }
    fclose(fpr_es);

    // 直接打印含中文字符串测试
    printf("请输入英文字符串“Chinese”:\n");
    // 读入英文字符串
    scanf("%s", str);
    printf("直接打印测试:\n");
    // 直接打印英文字符串
    printf("str=%s\n", str);
    // 与英文字符串常量进行比较
    printf("strcmp(%s, %s)=%d\n", str_es, str, strcmp(str_es, str));

    // 英文字符串写入文件测试
    printf("写文件测试:\n");
    FILE *fpw_es = fopen("es_tar.txt", "w");
    fprintf(fpw_es, "%s\n%s\n", str_es, str);
    fclose(fpw_es);
    printf("写入完成!\n");

    // 读中文字符串的文本文件测试
    printf("读文件测试:\n");
    FILE *fpr_ch = fopen("ch_src.txt", "r");
    while (fgets(str, 30, fpr_ch) != NULL)
    {
        printf("strcmp(%s, %s)=%d\n", str_ch, str, strcmp(str_ch, str));
    }
    fclose(fpr_ch);

    // 直接打印中文字符串测试
    printf("请输入中文字符串“中文”:\n");
    // 读入中文字符串
    scanf("%s", str);
    printf("直接打印测试:\n");
    // 直接打印中文字符串
    printf("str=%s\n", str);
    // 与中文字符串常量进行比较
    printf("strcmp(%s, %s)=%d\n", str_ch, str, strcmp(str_ch, str));

    // 中文字符串写入文件测试
    printf("写文件测试:\n");
    FILE *fpw_ch = fopen("ch_tar.txt", "w");
    fprintf(fpw_ch, "%s\n%s\n", str_ch, str);
    fclose(fpw_ch);
    printf("写入完成!\n");

    system("pause");
    return 0;
}
测试结果
  1. 控制台输出结果
    可以看到
    (a) 从文件中读取英文字符串并打印可以正常显示;直接打印英文字符串常量和直接打印从键盘读入的英文字符串均正常显示,使用strcmp进行比较结果为0。
    (b) 从文件中读取中文字符串并打印可以正常显示;直接打印中文字符串常量可以正常显示,但是没有显示出从键盘读入的中文字符串,使用strcmp进行比较结果也不为0。
    在这里插入图片描述
读文件测试:
strcmp(Chinese, Chinese)=0 
请输入英文字符串“Chinese”:
Chinese
直接打印测试:
str=Chinese
strcmp(Chinese, Chinese)=0
写文件测试:
写入完成!
读文件测试:
strcmp(中文, 中文)=0      
请输入中文字符串“中文”:  
中文
直接打印测试:
str=
strcmp(中文, )=1
写文件测试:
写入完成!
Press any key to continue . . .
  1. 英文字符串文本文件 es_tar.txt
    英文字符串常量和从键盘读入的英文字符串均正常写入到文件中。
Chinese
Chinese

  1. 中文字符串文本文件 ch_tar.txt
    中文字符串常量正常写入到文件,而从键盘读入的中文字符串写入到文件中的是乱码
中文


现象描述

在使用VSCode + MinGW作为集成开发环境时,在不修改默认设置的情况下执行有中文字符的字符串操作时,通常会遇到以下几个问题:

  1. 直接打印含中文字符的字符串常量,比如printf("中文")或者printf("%s", "中文"),均可正常显示;但是打印由键盘读入的含中文字符的字符串时,如scanf("%s", str); printf("%s", str);,含中文字符的字符串str无法正常显示(不显示,或者显示为乱码)。
  2. 在读文件操作中,可以成功读入文本文件中的中文字符串,并且与中文字符串常量比较结果相等;但是在写文件操作中,写入文件的中文字符串常量能正常显示,但是由键盘读入的中文字符串则无法正常显示(不显示,或者显示为乱码)。

简而言之,从键盘读入的中文字符串无法正常显示和写入文件

问题分析

已知信息:

  1. Windows(中文)默认的字符集是Windows-936(GBK)。
  2. 默认配置下,VSCode使用其内置集成终端运行编译后的exe可执行文件,使用chcp命令可知此终端使用的字符集编码是65001,即UTF-8编码。
  3. 默认配置下,VSCode中新建的文件使用的编码也是UTF-8。
  4. 默认配置下,GCC编译器MinGW的内部默认编码是UTF-8。
    可能的原因:
    由键盘读入的中文字符串使用的是GBK编码,但是程序运行过程中使用的都是UTF-8编码。

解决方案

既然读入的中文字符是GBK编码无法修改,那就把其他相关的地方全都改成gbk编码即可。

修改默认配置
1. 已经存在的文件全部使用gbk编码重新保存。

修改文件编码1
修改文件编码2

2. 在工程目录下新建.vscode目录,如果已存在则跳过此步骤。
3. 在.vscode目录中新建settings.jsonlaunch.json两个文件,已有则跳过。
4. settings.json文件添加以下内容,使文件全部变成gbk编码:
{
    "files.encoding": "gbk"
}
5. launch.json中修改以下内容,使用外置控制台运行编译后程序:
{
    "configurations": [
        {
            ...
            "externalConsole": true,
            ...
        }
    ],
    "version": "2.0.0"
}
修改后测试代码的运行结果
  1. 控制台输出
    运行结果
读文件测试:
strcmp(Chinese, Chinese)=0
请输入英文字符串“Chinese”:
Chinese
直接打印测试:
str=Chinese
strcmp(Chinese, Chinese)=0
写文件测试:
写入完成!
读文件测试:
strcmp(中文, 中文)=0
请输入中文字符串“中文”:
中文
直接打印测试:
str=中文
strcmp(中文, 中文)=0
写文件测试:
写入完成!
请按任意键继续. . .
  1. es_tar.txt
Chinese
Chinese

  1. ch_tar.txt
中文
中文

以上为全部内容,欢迎批评指正。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要在VS Code中使用GCC编译器,你需要按照以下步骤进行安装和配置: 1. 首先,从官方网站下载并安装VS Code:https://code.visualstudio.com/ 2. 下载并解压缩GCC编译器。你可以从指定的链接下载打包好的GCC编译器,例如:https://download.csdn.net/download/fuyanhuangyan/20353538 。解压缩后,将GCC编译器的文件夹放到你喜欢的位置。 3. 打开VS Code,并安装C/C++扩展。点击左侧的扩展按钮,搜索并安装"C/C++"扩展。 4. 配置VS Code以使用GCC编译器。点击VS Code的"文件"菜单,选择"首选项",然后选择"设置"。在设置中,搜索"C++",找到"C++: IntelliSense"选项,点击右侧的"编辑设置"按钮。在打开的settings.json文件中,添加以下代码: ```json "compilerPath": "your-gcc-compiler-path" ``` 将"your-gcc-compiler-path"替换为你解压缩的GCC编译器的路径。例如,如果你将GCC编译器放在C:\gcc目录下,那么配置应为: ```json "compilerPath": "C:\\gcc\\bin\\gcc.exe" ``` 5. 保存并关闭settings.json文件。 6. 现在,你可以打开一个C或C++文件,点击右上角的"选择编译器"按钮,选择GCC编译器。如果一切正常,你应该可以使用GCC编译器来编译和运行你的代码了。 要验证GCC编译器是否成功安装并配置,在VS Code的终端中执行"gcc -v"命令。你应该能够看到GCC的版本信息。 请注意,VS Code自带的是一个轻量级的代码编辑器,它不包含编译器。因此,你需要单独安装和配置GCC编译器以使用它来编译和运行你的代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Visual Studio Code配置C语言编译环境(使用gcc编译器)](https://blog.csdn.net/fuyanhuangyan/article/details/117393215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [VScode+gcc编译环境搭建](https://blog.csdn.net/weixin_43786336/article/details/122543876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偏安zzcoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值