VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rgba(37, 41, 51, 1) }
.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { line-height: 1.5; margin-top: 35px; margin-bottom: 10px; padding-bottom: 5px }
.markdown-body h1 { font-size: 24px; line-height: 38px; margin-bottom: 5px }
.markdown-body h2 { font-size: 22px; line-height: 34px; padding-bottom: 12px; border-bottom: 1px solid rgba(236, 236, 236, 1) }
.markdown-body h3 { font-size: 20px; line-height: 28px }
.markdown-body h4 { font-size: 18px; line-height: 26px }
.markdown-body h5 { font-size: 17px; line-height: 24px }
.markdown-body h6 { font-size: 16px; line-height: 24px }
.markdown-body p { line-height: inherit; margin-top: 22px; margin-bottom: 22px }
.markdown-body img { max-width: 100% }
.markdown-body hr { border-top: 1px solid rgba(221, 221, 221, 1); border-right: none; border-bottom: none; border-left: none; margin-top: 32px; margin-bottom: 32px }
.markdown-body code { border-radius: 2px; overflow-x: auto; background-color: rgba(255, 245, 245, 1); color: rgba(255, 80, 44, 1); font-size: 0.87em; padding: 0.065em 0.4em }
.markdown-body code, .markdown-body pre { font-family: Menlo, Monaco, Consolas, Courier New, monospace }
.markdown-body pre { overflow: auto; position: relative; line-height: 1.75 }
.markdown-body pre>code { font-size: 12px; padding: 15px 12px; margin: 0; word-break: normal; display: block; overflow-x: auto; color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) }
.markdown-body a { text-decoration: none; color: rgba(2, 105, 200, 1); border-bottom: 1px solid rgba(209, 233, 255, 1) }
.markdown-body a:active, .markdown-body a:hover { color: rgba(39, 91, 140, 1) }
.markdown-body table { display: inline-block !important; font-size: 12px; width: auto; max-width: 100%; overflow: auto; border: 1px solid rgba(246, 246, 246, 1) }
.markdown-body thead { background: rgba(246, 246, 246, 1); color: rgba(0, 0, 0, 1); text-align: left }
.markdown-body tr:nth-child(2n) { background-color: rgba(252, 252, 252, 1) }
.markdown-body td, .markdown-body th { padding: 12px 7px; line-height: 24px }
.markdown-body td { min-width: 120px }
.markdown-body blockquote { color: rgba(102, 102, 102, 1); padding: 1px 23px; margin: 22px 0; border-left: 4px solid rgba(203, 203, 203, 1); background-color: rgba(248, 248, 248, 1) }
.markdown-body blockquote:after { display: block; content: "" }
.markdown-body blockquote>p { margin: 10px 0 }
.markdown-body ol, .markdown-body ul { padding-left: 28px }
.markdown-body ol li, .markdown-body ul li { margin-bottom: 0; list-style: inherit }
.markdown-body ol li .task-list-item, .markdown-body ul li .task-list-item { list-style: none }
.markdown-body ol li .task-list-item ol, .markdown-body ol li .task-list-item ul, .markdown-body ul li .task-list-item ol, .markdown-body ul li .task-list-item ul { margin-top: 0 }
.markdown-body ol ol, .markdown-body ol ul, .markdown-body ul ol, .markdown-body ul ul { margin-top: 3px }
.markdown-body ol li { padding-left: 6px }
.markdown-body .contains-task-list { padding-left: 0 }
.markdown-body .task-list-item { list-style: none }
@media (max-width: 720px) { .markdown-body h1 { font-size: 24px } .markdown-body h2 { font-size: 20px } .markdown-body h3 { font-size: 18px } }.markdown-body pre, .markdown-body pre>code.hljs { color: rgba(51, 51, 51, 1); background: rgba(248, 248, 248, 1) }
.hljs-comment, .hljs-quote { color: rgba(153, 153, 136, 1); font-style: italic }
.hljs-keyword, .hljs-selector-tag, .hljs-subst { color: rgba(51, 51, 51, 1); font-weight: 700 }
.hljs-literal, .hljs-number, .hljs-tag .hljs-attr, .hljs-template-variable, .hljs-variable { color: rgba(0, 128, 128, 1) }
.hljs-doctag, .hljs-string { color: rgba(221, 17, 68, 1) }
.hljs-section, .hljs-selector-id, .hljs-title { color: rgba(153, 0, 0, 1); font-weight: 700 }
.hljs-subst { font-weight: 400 }
.hljs-class .hljs-title, .hljs-type { color: rgba(68, 85, 136, 1); font-weight: 700 }
.hljs-attribute, .hljs-name, .hljs-tag { color: rgba(0, 0, 128, 1); font-weight: 400 }
.hljs-link, .hljs-regexp { color: rgba(0, 153, 38, 1) }
.hljs-bullet, .hljs-symbol { color: rgba(153, 0, 115, 1) }
.hljs-built_in, .hljs-builtin-name { color: rgba(0, 134, 179, 1) }
.hljs-meta { color: rgba(153, 153, 153, 1); font-weight: 700 }
.hljs-deletion { background: rgba(255, 221, 221, 1) }
.hljs-addition { background: rgba(221, 255, 221, 1) }
.hljs-emphasis { font-style: italic }
.hljs-strong { font-weight: 700 }
@[toc]
问题背景
在较长一段时间里,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。具体开发环境的搭建过程在此不作讲解,本文关注点在于开发过程中遇到的中文字符相关的乱码问题。
问题描述
测试代码
- 英文字符串文本文件 es_src.txt
Chinese
- 中文字符串文本文件 ch_src.txt
中文
- 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;
}
测试结果
- 控制台输出结果
可以看到
(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 . . .
- 英文字符串文本文件 es_tar.txt
英文字符串常量和从键盘读入的英文字符串均正常写入到文件中。
Chinese
Chinese
- 中文字符串文本文件 ch_tar.txt
中文字符串常量正常写入到文件,而从键盘读入的中文字符串写入到文件中的是乱码。
中文
现象描述
在使用VSCode + MinGW作为集成开发环境时,在不修改默认设置的情况下执行有中文字符的字符串操作时,通常会遇到以下几个问题:
- 直接打印含中文字符的字符串常量,比如
printf("中文")或者printf("%s", "中文"),均可正常显示;但是打印由键盘读入的含中文字符的字符串时,如scanf("%s", str); printf("%s", str);,含中文字符的字符串str无法正常显示(不显示,或者显示为乱码)。 - 在读文件操作中,可以成功读入文本文件中的中文字符串,并且与中文字符串常量比较结果相等;但是在写文件操作中,写入文件的中文字符串常量能正常显示,但是由键盘读入的中文字符串则无法正常显示(不显示,或者显示为乱码)。
简而言之,从键盘读入的中文字符串无法正常显示和写入文件。
问题分析
已知信息:
- Windows(中文)默认的字符集是Windows-936(GBK)。
- 默认配置下,VSCode使用其内置集成终端运行编译后的exe可执行文件,使用
chcp命令可知此终端使用的字符集编码是65001,即UTF-8编码。 - 默认配置下,VSCode中新建的文件使用的编码也是UTF-8。
- 默认配置下,GCC编译器MinGW的内部默认编码是UTF-8。
可能的原因:
由键盘读入的中文字符串使用的是GBK编码,但是程序运行过程中使用的都是UTF-8编码。
解决方案
既然读入的中文字符是GBK编码无法修改,那就把其他相关的地方全都改成gbk编码即可。
修改默认配置
1. 已经存在的文件全部使用gbk编码重新保存。
2. 在工程目录下新建.vscode目录,如果已存在则跳过此步骤。
3. 在.vscode目录中新建settings.json,launch.json两个文件,已有则跳过。
4. settings.json文件添加以下内容,使文件全部变成gbk编码:
{
"files.encoding": "gbk"
}
5. launch.json中修改以下内容,使用外置控制台运行编译后程序:
{
"configurations": [
{
...
"externalConsole": true,
...
}
],
"version": "2.0.0"
}
修改后测试代码的运行结果
- 控制台输出
读文件测试:
strcmp(Chinese, Chinese)=0
请输入英文字符串“Chinese”:
Chinese
直接打印测试:
str=Chinese
strcmp(Chinese, Chinese)=0
写文件测试:
写入完成!
读文件测试:
strcmp(中文, 中文)=0
请输入中文字符串“中文”:
中文
直接打印测试:
str=中文
strcmp(中文, 中文)=0
写文件测试:
写入完成!
请按任意键继续. . .
- es_tar.txt
Chinese
Chinese
- ch_tar.txt
中文
中文
以上为全部内容,欢迎批评指正。
VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法的更多相关文章
- Android项目更换开发环境时出现的 java.lang.VerifyError 异常解决办法
from://http://blog.csdn.net/wudiwo/article/details/7548451 项目是从同事的电脑上直接拷贝过来的,项目里面的jar包是在项目跟下libs里面存放 ...
- Sqlserver 2016 R Service环境安装的各种错误(坑)解决办法
相信很多朋友都会慕名Sqlserver 2016的R语言功能,将自己的数据库升级到Sqlserver 2016,但是当你安装完Sqlserver 2016的R语言组件之后,你会发现并不能直接使用,比如 ...
- Ubuntu16.04下配置VScode的C/C++开发环境
博客转载:https://blog.csdn.net/weixin_43374723/article/details/84064644 Visual studio code是微软发布的一个运行于 Ma ...
- Mac上利用VScode配置c/c++开发环境
Mac上利用VScode配置c/c++开发环境 哭辽,Typora里面最好不要插入表情,不然保存会闪退 首先你要有一个vscode 在扩展里面下载c/c++ 第一步 ⬆+com+p 打开命令模式:选择 ...
- VSCode, Django, and Anaconda开发环境集成配置[Windows]
之前一直是在Ubuntu下进行Python和Django开发,最近换了电脑,把在Virtual Box 下跑的Ubuntu开发机挪过来总是频繁崩溃,索性就尝试把开发环境挪到Windows主力机了. 不 ...
- VSCode 微信小程序 开发环境配置 详细教程
本博客已暂停更新,需要请转新博客http://www.whbwiki.com/231.html 配置 VsCode 微信小程序开发环境并非不用官方的 微信小程序开发者工具 ,而是两者配合适用,可以极大 ...
- JAVA的中文字符乱码问题
来源:http://luzefengoo.blog.163.com/blog/static/1403593882012754428536/ JAVA的中文字符乱码问题一直很让人头疼.特别是在WEB应用 ...
- windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法
按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ...
- 【已解决】python中文字符乱码(GB2312,GBK,GB18030相关的问题)
http://againinput4.blog.163.com/blog/static/1727994912011111011432810/ [已解决]python中文字符乱码(GB2312,GB ...
- QT Creator有中文出现“常量中有换行符 ”的解决办法
QT Creator有中文出现“常量中有换行符 ”的解决办法 QT Creator在QT5.9下报错“常量中有换行符 ”,我的代码中有中文,而且在Windows 10下用微软VS编译器编译.造成这个报 ...
随机推荐
- KNN算法之KD树(K-dimension Tree)实现 K近邻查询
KD树是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,如范围搜索和最近邻搜索. KD树使用了分治的思想,对比二叉搜索树(BST),KD树解决的是多维空间内的最近点(K近点)问题.( ...
- [研究]SpringBoot-MybatisPlus-Dynamic(多数据源)
SpringBoot-MybatisPlus-Dynamic(多数据源) 前言 基于工作上班累死了...打开自己电脑 不知道干些啥 就康康 PL 网站康康 更新了啥 咦~~~还挺多 看到了多数 ...
- Windows 设置 VMware workstation 虚拟机开机启动
参考 https://www.cnblogs.com/qmfsun/p/6284236.html http://www.cnblogs.com/eliteboy/p/7838091.html 司徒晓宇 ...
- [极客大挑战 2019]Havefun 1
[极客大挑战 2019]Havefun 1 一,审题,观察题目信息和知识点 观察题目,没发现有效信息 F12打开源代码,发现有一个GET传输. 知识点 GET方法的数据传输是通过URL传输的, ...
- NebulaGraph实战:1-NebulaGraph安装和基础操作
以前使用Neo4j图数据库,考虑到生产环境需要最终选择了NebulaGraph图数据库.对于数据要求比较高的领域,比如医疗.财务等,暂时还是离不开知识图谱的.后面主要围绕LLM+KG做一些行业解决 ...
- 六步带你体验EDS交换数据全流程
本期我们将走进XX医疗集团向某慢病院共享数据的场景,如何通过EDS完成数据交换,进而实现医疗数据的安全可控共享. 本文分享自华为云社区<[EDS从小白到专家]第1期-六步带你体验EDS交换数据全 ...
- AI推理实践丨多路极致性能目标检测最佳实践设计解密
摘要:基于CANN的多路极致性能目标检测最佳实践设计解密. 本文分享自华为云社区<基于CANN的AI推理最佳实践丨多路极致性能目标检测应用设计解密>,作者: 昇腾CANN . 当前人工智能 ...
- 如何只用一个小时定制一个行业AI 模型?
摘要:华为云通过ModelArts Pro提供更多的行业套件和工作流可以供用户直接使用,进一步降低AI行业落地难度,让传统企业客户无需掌握算法知识亦可实现自身业务与AI技术的融合. 去年,在华为开发者 ...
- 常用的echo和cat,这次让我折在了特殊字符丢失问题上
摘要:用过linux的都知道,echo和cat是我们常用的展示内容和写入内容的方式. 本文分享自华为云社区<echo和cat,重定向到文件时,解决特殊字符丢失问题>,作者: 大金(内蒙的) ...
- 渗透测试 vs 漏洞扫描:差异与不同
渗透测试和漏洞扫描常常被混淆,这两者都通过探索系统来寻找 IT 基础架构中的弱点及易受攻击的地方.阅读本文,带你了解两者之间的差异与不同. 手动 vs 自动 渗透测试是一种手动安全评估方式,网络安全人 ...