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

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

时间:2023-04-22 15:55:31浏览次数:38  
标签:中文 Chinese GCC 乱码 编译器 str printf 字符串 strcmp

目录

问题背景

在较长一段时间里,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
中文
中文

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

标签:中文,Chinese,GCC,乱码,编译器,str,printf,字符串,strcmp
From: https://www.cnblogs.com/breezefaith/p/17343242.html

相关文章

  • GCC预处理、编译、汇编、链接全过程
    //hello.c#include<stdio.h>intmain(void){printf("Hello,world!\n");return0;} 预处理:替代宏,引入头文件cpphello.c>hello.i 编译:gcc-Wall-Shello.i(生成hello.s) 汇编:ashello.s-ohello.o(生成hello.o) 链接:复杂ld版:ld-dynamic-linke......
  • Linux环境aspose插件word转pdf中文乱码解决方案
    本地没出现这个问题,到了linux环境出现了这个问题。第一想到的是字体。 解决方案1:环境解决安装字库,将win机器的c:\windows\fonts目录下的全部文件拷贝到生产服务器字体安装目录下,然后执行以下命令更新字体缓存。查看linux目前的所有字体fc-list查看Linux目前的所有中文......
  • JVM中的编译器
    JVM中集成了两种编译器,ClientCompiler和ServerCompiler,它们的作用也不同。ClientCompiler注重启动速度和局部的优化,ServerCompiler则更加关注全局的优化,性能会更好,但由于会进行更多的全局分析,所以启动速度会变慢。两种编译器有着不同的应用场景,在虚拟机中同时发挥作用。Clien......
  • mysql数据库学习1-cmd中乱码怎么办
    由于今天学习orcal,于是便顺便看下mysql,不看不知道,一看吓一跳,自己竟然不知道怎么用cmd登陆mysql。荒废了如此!首先,我们在cmd中要输入用户名和密码,此处的登陆方式不同于sqlplus;mysql-u用户名-p密码在查看当前用户下的表列表时,发现有几个是乱码,因为实在navicat中创建的,所以在编......
  • Request请求参数中文乱码问题
    Tomcat8以下的默认编码格式是ISO-8859-1,8版本以上Tomcat已经把默认编码格式改为UTF-8,此篇博客主要是解决Tomcat8以下版本的中文乱码问题处理。一、Request请求参数中文乱码-POST解决方案请求参数如果存在中文数据,则会乱码解决方案:POST:设置输入流的编码req.setCharacterEnc......
  • xShell终端中文乱码完全解决方法
    转至:https://www.shuzhiduo.com/A/gVdnq0y85W/xShell(xShell5)以及其他终端中文乱码的原因无非有三种:(1)Linux系统的编码问题;(2)xShell终端的编码问题; (3)两端的语言编码不一致;1.Linux系统的编码问题(1)执行locale命令查看系统语言;(2)设置系统环境变量LANG为e......
  • Linux解压缩文件乱码的解决
    Linux解压缩文件乱码的解决使用unzip软件提供了-O参数(以及-I参数),可以指定编码。-OCHARSET为DOS,Windows和OS/2归档文件指定字符编码-ICHARSET为UNIX和其他归档文件指定字符编码 例子:解压缩example.zip文件到当前目录,使用归档管理器打开为乱码。example.zip为windows环......
  • SecureCRT中文显示乱码
    评:环境:SecureCRT登陆REDHAT5.3LINUX系统问题:vi编辑器编辑文件时文件中的内容中文显示乱码,但是直接使用linux系统terminal打开此文件时中文显示正常,确诊问题出现在客户端即SecureCRT的显示问题解决方法:1、修改远程linux机器的配置#vi/etc/sysconfig/i18n把LANG改成支......
  • Web 下载文件名乱码解决以及多浏览器兼容方案
    在web开发中,经常我们会遇到如导出或者下载网页这种需求,但是往往会遇到在chrome浏览器下载的文件名正常,但是到firefox,Safari上却乱码的情况,经过网上的资料多次研究,最终总结出了如下的方法,代码如下:///<summary>///浏览器下载文件,完整文件下载,不支持分片下载,为了兼容safari,下......
  • gcc: fatal error: cannot execute ‘cc1plus’: execvp: No such file or directory
     01、安装 HTSeq软件出现如下报错,编译失败 02、原因是没有c++编译器,解决方法:aptinstallg++##安装c++编译器 03、再次安装HTseq,报错消失。 ......