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

这篇具有很好参考价值的文章主要介绍了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。
    VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
读文件测试:
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编码重新保存。

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

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. 控制台输出
    VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
读文件测试:
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
中文
中文

以上为全部内容,欢迎批评指正。文章来源地址https://www.toymoban.com/news/detail-421197.html

到了这里,关于VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MinGW-w64的安装详细步骤(c/c++的编译器gcc、g++的windows版,win10、win11真实可用)

    MinGW(Minimalist GNU for Windows) 是一个用于 Windows 平台的开发工具集,它提供了一组 GNU 工具和库,可以用于编译和构建本地的 Windows 应用程序。 MinGW 的目标是在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序。

    2024年02月13日
    浏览(41)
  • 【UNIX 环境编程】GCC 编译器 | Makefile 基础入门 | GDB 调试教学

    💭 写在前面: 本文将介绍如何使用 GCC 编译器编译,并详细介绍了 Makefile 的基本构造、创建Makefile 文件以及 Makefile 变量,以提高编译效率。此外,本文还将探讨GDB调试器的使用,包括调试前的准备、readelf 读取 ELF 文件信息、显示代码、断点、调试、监视、跳转等内容。 

    2024年02月03日
    浏览(21)
  • Linux驱动开发笔记(二):ubuntu系统从源码编译安装gcc7.3.0编译器

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130533941 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(一

    2024年02月06日
    浏览(24)
  • VSCode配置C/C++环境,编辑(VSCode)+ 编译(MinGW->GCC)+ 调试(MinGW->GBD)

      直接去官网下载并安装即可:https://code.visualstudio.com/。注意:VSCode只是编辑器,可以看代码,编辑代码,但不能编译代码。   如果说VSCode可以实现代码编辑,MinGW则可以实现代码编译和调试,其中编译功能是通过MinGW中的GCC实现的(生成一个.exe文件),调试功能则是通

    2024年02月07日
    浏览(28)
  • [matlab]matlab配置mingw64编译器

    第一步:下载官方绿色版本mingw64编译器然后解压放到一个非中文空格路径下面  比如我mingw64-win是我随便改的文件名,然后添加环境变量,选择用户或者系统环境变量添加下面的变量 变量名: MW_MINGW64_LOC 变量值:自己的mingw路径 最后记得重启matlab打开matlab输入 mex -setup  在输

    2024年02月11日
    浏览(29)
  • VSCode编译器环境下,调试3d-tiles-validator

    参照3d-tiles-validator仓库的 README.md文件 Clone the repository into the current directory: Change into the directory of the cloned repository: Install the validator and all its dependencies: 完成上述步骤后,\\\"ts-node\\\"可以直接来执行3d-tiles-validator VsCode打开3d-tiles-validator文件夹 Ctrl+Shift+D 打开运行调试配置面板,添加

    2024年02月11日
    浏览(22)
  • Windows下QT Creator安装MinGW 32bit编译器

      注:本作者是基于FFmpeg开发需要,故在Windows下QT Creator中安装MinGW 32bit编译器!其它型号编译器参照此文章基本可以实现! 1、下载链接 链接: 2、下载后的文件(Qt路径下包含:5.12.0文件和Tools文件): 1、将:Qt/Tools/mingw730_32拷贝到QT Creator安装路径下的Tools文件下 2、将:

    2024年02月14日
    浏览(39)
  • vscode开发c++ 程序,配置使用微软自家的cl编译器。

    vscode 写c++代码, 配置为使用微软自己的cl编译器: 1.安装visual studio 2022, 并且创建一个可以正常编译的cpp工程。 2. 从visual studio 2022的菜单 项目 属性,查出include和lib的配置信息,并录入到window的系统环境变量中,当然还要把cl可执行文件的路径也录入到window11系统PATH中,如下

    2024年03月19日
    浏览(37)
  • Linux:编译器 - gcc

    GCC(英文全拼:GNU Compiler Collection)是 GNU 工具链的主要组成部分,是一套以 GPL 和 LGPL 许可证发布的程序语言编译器自由软件,由 Richard Stallman 于 1985 年开始开发。 gcc是GCC中的C语言编译器,而g++是GCC中的C++编译器。本博客只讲解gcc,g++的语法和选项和gcc都是一致的。 gcc 编译

    2024年04月14日
    浏览(56)
  • Linux GCC常用命令以及GCC编译器

    GCC 是编译工具,它的意思是 GNU C Compiler 。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言等等。而 GCC 也不再单只是 GNU C 语言编译器的意

    2024年02月05日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包