vscode调试配置和输出中文乱码,这两个问题是我使用vscode遇到的两个最难解决的也是最重要的两个问题,网上的解答很多都已经过时而且没用,以至于我花费了大量的时间在网上搜寻有用的解决方法,好在是在结合自己的很多次尝试后终于艰难地解决了。
所以我总结了我遇到的问题并写出相应的解决方法,然而每个人电脑的情况都不尽相同,但还是希望对看到的朋友提供一些帮助和解决的思路。下面是我电脑的类型和配置:
- C++使用的是mingw64
下面是本文章所解决的四个问题:
问题一:如何配置原生断点调试和运行?
问题二:如何更改调试和运行环境为vscode内的终端还是系统的cmd终端?
问题三:在vscode内置终端中,如何选择Powershell终端还是cmd终端?
问题四:如何解决输出中文字符乱码的情况?
问题一:如何配置原生断点调试和运行?
这个问题指的是在vdscode中可以打断点调试的功能(快捷键是F5),即下图处的功能:
我的建议是:
- 直接在你的工作区的目录新建一个
.vscode
文件夹; - 在
.vscode
文件夹中新建tasks.json
和launch.json
两个文件; - 粘贴下面的两段到这两个文件中(因为我这个也是粘贴别人的):
- tasks.json:(不用更改,直接复制即可)
{
"version": "2.0.0",
"command": "g++",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}.exe"
],
"problemMatcher": {
"owner": "cpp",
"fileLocation": [
"relative",
"${workspaceRoot}"
],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
},
"group": {
"kind": "build",
"isDefault": true
}
}
- launch.json:(需要更改miDebuggerPath中的值为你的mingw64的
gdb.exe
的位置,gdb.exe在mingw中的bin文件夹下,注意\
要改成\\
来避免转义字符)
{
"version": "0.2.0",
"configurations": [
{
"name": "C/C++",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true, // true为选择外置终端、false为选择vdcode内置终端
"MIMode": "gdb",
"miDebuggerPath": "D:\\My_Software\\mingw64\\bin\\gdb.exe", // 这里要替换成你的mingw64的gdb.exe的位置,不要写成gcc,这个是debug的exe
"preLaunchTask": "g++",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
},
]
}
- 千万要注意代码文件命名!!! 你的.cpp的代码文件还有mingw的目录和文件名一定不要出现中文或者其他非英文数字下划线的字符!!尽量符合C/C++语言的变量命名规范,否则会出现
No such file or directory
的错误(例子是将.cpp文件命名为哈哈.cpp
):
- 然后你就按F5可以试着打断点进行调试了(有什么问题可以留言……我也可能不会太懂,但如果遇到过这个情况兴许可以解决)
问题二:如何更改调试和运行环境为vscode内的终端还是系统的cmd终端?
在launch.json
中设置"externalConsole"
:
"externalConsole": true // true代表在系统终端运行,非,false代表在vscode内置终端运行
问题三:在vscode内置终端中,如何选择Powershell终端还是cmd终端?
直接在vscode的设置中搜索terminal.integrated.defaultProfile.windows
,选择Powershell或Command Prompt
问题四:如何解决输出中文字符乱码的情况?
在问题二中,你学会了选择在系统cmd终端和vscode内置终端运行cpp文件,所以该问题要分为两种情况:
第一种是 系统cmd终端乱码 的情况(要讲的方法对所有UTF-8文件系统终端输出中文乱码的方式都使用):
因为vscode中新建的的.cpp文件默认是UTF-8的编码,于是调试时会弹出系统cmd终端来运行.exe文件,而cmd终端默认是GBK编码,然后就会中文乱码:
方法一(更改代码文件的编码):
- 因为vscode默认新建文件是UTF-8编码,而cmd终端默认用的是GBK编码,所以你可以通过将UTF-8编码转换成GBK编码,就可以解决输出中文乱码的问题。
- 点击右下角的
UTF-8
:
- 选择通过编码保存:
- 找到GBK编码并选择,然后就可以正常输出中文了。
- 点击右下角的
方法二(更改cmd终端的默认编码):
也就是说将cmd的默认编码方式更改为UTF-8
- 打开注册表:
- 进入到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
目录下:
- 右键-新建-字符串值, 名称为
autorun
,值为chcp 65001
,也可以多加一个命令写成chcp 65001 >nul
,写完之后确定。chcp
似乎是change code page的简写,65001
是UTF-8的编码号,而>nul
可以在终端隐藏你刚才的那条命令的输出。
- 然后这个时候你兴高采烈地以为就可以解决了,但是再去调试的时候,会发现仍是乱码,而且你的输出还被莫名其妙地覆盖了
那这该怎么解决呢???
答:在main函数开头再加一段system("pause");
根据我的观察,会出现这种情况的原因是因为cmd执行.exe
文件时不会使用autorun
里面的命令,而当使用system("pause");
时会激活,使其执行autorun
里的命令。 - 到此为止这个问题就解决了。
下图是
>nul
的作用:
第二种是 vscode内置终端 乱码的情况
在问题3中你学会了在vscode内置终端中如何选择powershell终端和cmd终端,所以该问题分为cmd终端和powershell终端两种情况:
- 首先无论怎样呢,我们要先在setting.json里配置相关的信息:
- 直接在vscode的设置中搜索
terminal.integrated.profiles.windows
,然后点击在setting.json中编辑
。
- 直接在vscode的设置中搜索
在json配置文件中插入两个终端的以下配置信息:
"terminal.integrated.profiles.windows": {
// 配置powershell
"PowerShell": {
"source": "PowerShell",
"icon": "terminal-powershell",
"args": ["-NoExit", "/c", "chcp 65001", ">null"]
},
// 配置cmd
"cmd": {
"path": "cmd.exe",
"icon": "terminal-cmd",
"args": ["/K chcp 65001 >nul"]
}
},
下面更改默认打开的终端:
- 设置你的vscode内置默认终端为cmd终端:
"terminal.integrated.defaultProfile.windows": "cmd"
- 设置你的vscode内置默认为powershell终端
"terminal.integrated.defaultProfile.windows": "PowerShell",