mingw控制台中文乱码
乱码原因
直接先用一段话讲乱码原因,看不懂老老实实就往下看吧
其实我用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。现在我们应该知道乱码的原因了。
整个过程是这样的:
- 我们代码的编码是UTF-8
- 把UTF-8编码的代码交给mingw,它也默认当做UTF-8处理(目前为止这是正确的)
- mingw处理后生成的数据还是UTF-8编码(目前为止还是正确的)
- 把mingw处理后的数据(UTF-8编码)给cmd(目前为止也是正确的)
- cmd按GBK编码处理它(UTF-8),这时出现错误,所以出现乱码
解决方案
我们可以修改mingw的输出,让它在编译时使用GBK编码输出,然后再让CMD去显示。
处理中文乱码只需要设置两个(核心只有一个)编译参数,即在tasks.json
中tasks
中的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
参考链接
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!
mingw控制台中文乱码的更多相关文章
- pycharm控制台中文乱码问题
pycharm控制台中文乱码问题一般是因为之前有配置保存到了文件里, C盘下.pycharm文件夹下有配置文件,删除文件后重装pycharm,配置会重置 不过最后解决问题的做法是删除配置文件后,重新装 ...
- mac中的myeclipse的控制台中文乱码问题解决办法
之前写java用到控制台的主要是字符和数字,中文输入貌似真的还没用过,所以就遇到了一个悲剧的老问题,估计每个程序员都会遇到——中文乱码. 用的是MyEclipse开发环境,Window->Gen ...
- Intellij idea操作maven时控制台中文乱码
只留存记录 windows环境下,Intellij idea12中maven操作时,控制台中文乱码问题(编译报错或者clean install时出现的其他错误描述乱码) 在cmd中mvn中文正常显示, ...
- IDEA操作maven时控制台中文乱码
windows环境下,Intellij idea12中maven操作时,控制台中文乱码问题(编译报错或者clean install时出现的其他错误描述乱码) 在cmd中mvn中文正常显示,log4j打 ...
- IDEA使用maven构建时控制台中文乱码的解决办法
使用maven clean install 项目时控制台中文乱码,解决办法如下: Setting->maven->runner VMoptions: -Dfile.encoding=UTF ...
- idea 控制台中文乱码
idea 控制台中文乱码,网上找了好多基本都是说在tomcat配置文件里面添加-Dfile.encoding=UTF-8 添加后依然乱码, 需要在idea64.exe.vmoptions文件中添加-D ...
- Tomcat启动时,控制台和IDEA控制台中文乱码解决方案
Tomcat启动时 控制台中文乱码 cmd控制台 IDEA控制台 解决方案 cmd乱码 打开Tomcat目录下的apache-tomcat-8.5.47\conf\logging.properties ...
- tomcat启动控制台中文乱码问题解决方法
tomcat启动控制台中文乱码问题解决方法,修改tomcat安装路径/conf/logging.properties文件 java.util.logging.ConsoleHandler.encodi ...
- Servlet学习之Tomcat控制台中文乱码问题
Tomcat控制台中文乱码问题 在更新了IDEA2020.1版本后,可以安装官方的简体中文插件,方便我们日常使用,但是更新后再运行Tomcat时,控制台的输出日志出现中文乱码问题,接下来告诉大家如何修 ...
随机推荐
- [LeetCode] 377. Combination Sum IV 组合之和 IV
Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...
- 用ArcMap在PostgreSQL中创建要素类需要执行”create enterprise geodatabase”吗
问:用Acmap在PostgreSQL中创建要素类需要执行"create enterprise geodatabase"吗? 关于这个问题,是在为新员工做postgresql培训后 ...
- js 获取服务端时间,并实现时钟
本例子以vue语法伪代码书写: 1,获取服务端北京时间 getRealTime() { let that = this; var xhr = new XMLHttpRequest(); if( !xh ...
- 如何解决visual studio2017 install 下载安装极慢的问题
问题: visual studio 2017 下载安装速度慢,只有6.70kb/s.其他版本估计也有这个问题. 解决方案: 进入目录:C:\Windows\System32\drivers\etc 右 ...
- 协议——SPI
SPI(Serial Peripheral interface)是由摩托罗拉公司定义的一种串行外围设备接口,是一种高速.全双工.同步的通信总线,只需要四根信号线即可,节约引脚,同时有利于PCB的布局. ...
- 可能这些是你想要的H5软键盘兼容方案
前言 最近一段时间在做 H5 聊天项目,踩过其中一大坑:输入框获取焦点,软键盘弹起,要求输入框吸附(或顶)在输入法框上.需求很明确,看似很简单,其实不然.从实验过一些机型上看,发现主要存在以下问题: ...
- vue+element+upload实现头像上传
后台 @RequestMapping("/up") public JSONObject up(@RequestParam("picFile") Multipar ...
- tkinter学习笔记_04
8.勾选项 checkbutton import tkinter as tk root = tk.Tk() root.title("xxx") root.geometry('200 ...
- [洛谷P5431]【模板】乘法逆元2
题目大意:给定$n(n\leqslant5\times10^6)$个正整数$a_i$,和$k$.求:$$\sum_{i=1}^n\dfrac{k^i}{a_i}\pmod p$$题解:$$令P=\pr ...
- oracle数据库 TIMESTAMP(6)时间戳类型
时间戳类型,参数6指的是表示秒的数字的小数点右边可以存储6位数字,最多9位.由于时间戳的精确度很高,我们也常常用来作为版本控制. 插入时,如下方式:insert into test4 values(t ...