乱码原因

直接先用一段话讲乱码原因,看不懂老老实实就往下看吧

其实我用Sublime或者VSCode等编辑器写代码出现的控制台中文乱码问题是编译器mingw输出的数据使用的是UTF-8编码,而控制台用了GBK编码来解析它

其实编码只要统一,用UTF8或者GBK都行,但用了错误的编码去解析文件就会出错。

问题来源

如果我们写轻量代码(比如写算法题)也用VS之类的IDE,就太不划算了;虽然也有Codeblocks、Dev C++这样的小一点的IDE,但用起来还是可以发现让人很不爽的缺点。

之前尝试用VS Code写C++代码,挺不错的,好看方便。但问题就是难配置,最大的问题是控制台中文乱码,我搞了好久都没搞好,今天终于解决了。

在网上找到一段话是这么讲的:

Windows(中文)默认的字符集是Windows-936(GBK),mingw的内部是GCC,而GCC编译器默认编译的时候是按照UTF-8解析和输出的,当未指定字符集时一律当作UTF-8进行处理,于是造成乱码。

根据上边这段话,我有点灵感,但还是有疑问,见下。

问题分析

我电脑的CMD编码设置的是UTF-8,代码文件的编码也是UTF-8,如果mingw默认按UTF-8处理的话,可以看到这里用的编码全都是UTF-8,那应该不会出现乱码的。

但我们确实看到了乱码啊!?

当我去看我的注册表(见下图),发现代码链接、编译后生成的可执行文件有一个单独的注册表,这似乎说明我们运行的可执行文件并不是我们口中的那个CMD(按Win+R、cmd打开的那个CMD)。所以@roadwide整理的网上的改CMD编码啊什么的,可能搞错了问题的方向,不过也算一个方法吧,但似乎对我不适用。我之前也是搞错了方向。

如下图所示,我们运行的可执行文件,也就是那个弹出来的控制台,它的编码是GBK。现在我们应该知道乱码的原因了。

整个过程是这样的:

  1. 我们代码的编码是UTF-8
  2. 把UTF-8编码的代码交给mingw,它也默认当做UTF-8处理(目前为止这是正确的)
  3. mingw处理后生成的数据还是UTF-8编码(目前为止还是正确的)
  4. 把mingw处理后的数据(UTF-8编码)给cmd(目前为止也是正确的)
  5. cmd按GBK编码处理它(UTF-8),这时出现错误,所以出现乱码

解决方案

我们可以修改mingw的输出,让它在编译时使用GBK编码输出,然后再让CMD去显示。


处理中文乱码只需要设置两个(核心只有一个)编译参数,即在tasks.jsontasks中的args中添加-fexec-charset=GBK-finput-charset=UTF-8,下边tasks.json中的第14、15行。


这个解决方案中代码文件的编码是UTF-8,控制台编码是GBK,令mingw实现编码转换。

下面的.vscode配置是我在网上找到的比较新的VS Code配置,可以作为参考,具体不做解释,想了解可以去看文章末的参考网址。

tasks.json

// 用来编译
{// See https://go.microsoft.com/fwlink/?LinkId=733558// for the documentation about the tasks.json format"version": "2.0.0","tasks": [{"label": "Build",   // 任务的名字叫Build(编译),注意是大小写区分的,等会在launch中调用这个名字"type": "shell",    // 任务执行的是shell命令"command": "g++",   // 命令是g++"args": [           //参数"-g",           // 调试//"-fexec-charset=GBK",   // 处理mingw中文编码问题"-finput-charset=UTF-8",// 处理mingw中文编码问题//"${file}", //当前文件路径,包括所在目录绝对路径和文件名"-o",      //对象名,不进行编译优化"${fileDirname}/exes/${fileBasenameNoExtension}.exe", //当前目录下exes文件夹下的exe文件,exe文件名为 当前文件名(去掉扩展名).exe],// 所以以上部分,就是在shell中执行下面这行语句(以我E盘中一个main.cpp为例)// g++ -g  -fexec-charset=GBK -finput-charset=UTF-8 e:\Study\Programming\Code\Algo\PTABasicLevelCPP\main.cpp -o e:\Study\Programming\Code\Algo\PTABasicLevelCPP/exes/main.exe"group": {"kind": "build","isDefault": true// 任务分组,tasks是个数组,意味着可以执行多个task// 在build组的任务们,可以通过在Command Palette(F1) 输入run build task来运行// 当然,如果任务分组是test,你就可以用run test task来运行 },"problemMatcher": ["$gcc" // 使用gcc捕获错误],}]
}

-fexec-charset=GBK是令mingw按GBK编码生成exe文件。

-finput-charset=UTF-8是令mingw按UTF-8编码处理。(经测试这个参数可以不设置)

launch.json

{"version": "0.2.0","configurations": [{"name": "C++ Launch (GDB)", // 调试时程序员看到的名字"preLaunchTask": "Build",   // launch之前会运行的任务,这个名字一定要跟tasks.json中的任务名一致"type": "cppdbg",           // 经测试,不可删除"request": "launch",        // 经测试,不可删除"program": "${fileDirname}/exes/${fileBasenameNoExtension}.exe", //运行当前打开文件的目录下exes文件夹中名字和当前文件相同,但扩展名为exe的程序"args": [],                 // 运行程序是默认是没有参数的"stopAtEntry": false,       // 选为true则会在打开控制台后停滞,暂时不执行程序"cwd": "${workspaceFolder}",// 当前工作路径:当前文件所在的工作空间"environment": [],"externalConsole": true,    // 是否使用外部控制台,"MIMode": "gdb","miDebuggerPath": "D:\\WorkingSoftware\\MinGW\\bin\\gdb.exe",   //调试器路径"setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}
// https://code.visualstudio.com/Docs/editor/debugging#_launch-configurations
// author: huihut
// Available variables which can be used inside of strings.
// ${workspaceRoot}: the root folder of the team
// ${file}: the current opened file
// ${fileBasename}: the current opened file's basename
// ${fileDirname}: the current opened file's dirname
// ${fileExtname}: the current opened file's extension
// ${cwd}: the current working directory of the spawned process

参考链接

中文乱码参考1

中文乱码参考2

VS Code配置参考


作者:@臭咸鱼

转载请注明出处:https://www.cnblogs.com/chouxianyu/

欢迎讨论和交流!


转载于:https://www.cnblogs.com/chouxianyu/p/11249810.html

mingw控制台中文乱码相关推荐

  1. 【2022年clion2022.2控制台中文乱码完美解决】

    [2022年clion2022.2控制台中文乱码完美解决] 前言 一.utf8下解决中文乱码 二.gbk编码下 总结 前言 提示:所有操作均在mingw编译器下进行,msvc编译器下请自行测试: 例如 ...

  2. pycharm 运行控制台中文乱码解决办法

    pycharm 运行控制台中文乱码解决办法

  3. elasticsearch解决控制台中文乱码问题

    elasticsearch解决控制台中文乱码问题 参考文章: (1)elasticsearch解决控制台中文乱码问题 (2)https://www.cnblogs.com/chenmz1995/p/1 ...

  4. 解决jenkins控制台中文乱码问题

    解决jenkins控制台中文乱码问题 参考文章: (1)解决jenkins控制台中文乱码问题 (2)https://www.cnblogs.com/gaigaige/p/6835084.html 备忘 ...

  5. IDEA 2020.3.2控制台中文乱码分享(亲测二、下图中控制台的编码改为UTF-8)

    IDEA 2020.3.2控制台中文乱码的个人解决方案分享 我的电脑环境:win1020h2,IDEA2020.3.2,Tomcat9.0.40,终端配的powershell 1 一.改文件编码,下面 ...

  6. intellij idea操作maven时控制台中文乱码

    只留存记录 windows环境下,Intellij idea12中maven操作时,控制台中文乱码问题(编译报错或者clean install时出现的其他错误描述乱码) 在cmd中mvn中文正常显示, ...

  7. IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题

    文章目录 前言 一.修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 二.修改 IntelliJ IDEA 全局编码.项目编码.属性文件编码 三.IntelliJ IDEA 中自定 ...

  8. 4种方法帮你解决IntelliJ IDEA控制台中文乱码问题

    摘要:在本文中总结了4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题. 前言 IntelliJ IDEA 如果不进行配置的话,运行程序时控制台中文乱码问题会非常严重,严重影响我们对信 ...

  9. idea messages中文乱码_2019.2版本IDEA控制台中文乱码尝试了很多方法都不行

    IDEA2019.2 控制台中文乱码,尝试了很多方法没解决,试了如下方法终于解决idea控制台中文乱码问题. 1.HELP->Edit Custom VM OPtions文件中加上下马这句话 - ...

最新文章

  1. html base64 本地图片,base64 html 图片
  2. 代码坏味道之非必要的
  3. Apache ZooKeeper - 使用原生的API操作ZK_ACL权限
  4. Spark Streaming(四)kafka搭建(单节点,单broker)
  5. const char* p 、char* const p、const (char*) p 理解记忆
  6. SAP CRM WebClient UI recent object的后台存储实现
  7. 微软bi 架构 服务器,微软BI体系结构.
  8. Codeforces274B
  9. html禁止页面左右滑动,js阻止移动端默认事件以及只阻止横向滚动事件方法
  10. Java之设计模式一
  11. 时间字段加一秒_面试Java后端却问我时间轮(Time Wheel)算法,面试官没想到我看过Dubbo源码!...
  12. 设计模式-单一职责原著
  13. AndroidX是什么?
  14. 王者荣耀在android目录下的名字,王者荣耀名字空白代码怎么弄_名字空白代码设置方法...
  15. 广义表C/C++实现详解
  16. 软件工程——软件测试方法
  17. C++实现内存“垃圾”回收机制
  18. 爬虫新手入门(二):爬取一本言情小说的内容
  19. 【无标题】元宇宙背后的安全隐患
  20. 使用 python 执行 vba 代码

热门文章

  1. JQuery 自己主动触发事件
  2. VMware Workstation 重启服务脚本 解决连不上ssh问题
  3. JavaWeb基础—数据库连接池DBCP、C3P0
  4. 【python】组合搜索
  5. const volatile同时限定一个类型int a = 10
  6. c编写程序完成m名旅客和n辆汽车的同步程序代写
  7. 我的世界java版怎么加整合包_我的世界1.9MOD简单整合下载 功能性懒人包
  8. matlab 最大熵谱估计,最大熵原理
  9. java 滚轮页面缩放_急..JAVA 在画布上画拖动滚动条可扩大缩小的长方形
  10. linux mysql5.7.9下载_关于linux-Centos 7下mysql 5.7.9的rpm包的安装方式