当前位置:   article > 正文

VScode解决终端输出乱码问题_vscode 汉字乱码 菱形

vscode 汉字乱码 菱形

VScode解决终端输出乱码问题

本篇技术博客旨在解决VScode运行代码过程中终端输出中文乱码的问题。

问题起源

博主最近在复习C语言的过程中,使用VScode作为自己的编辑器,但是VScode有个问题,他在输出中文的时候会输出乱码,笔者对于UTF-8/GBK之类的编码知识略有学习,所以一开始以为自己是代码的编码方式选错了,于是在UTF-8与GBK两种编码中间横跳,发现无论是选择UTF-8还是GBK都无法解决中文乱码的问题。
这里可以选择UTF-8和GBK的编码方式
在经过了漫长的查找资料和尝试以后,博主发现了中文乱码背后的原因,由于VScode本身是一个编辑器,所以其本身是不具备代码运行的能力的,我们需要下载GUN集成开发环境,博主选择的是Mingw+VScode下C/C++插件这样的一个组合

下面是中文乱码的原因解释:

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

知道了原因以后,我们有两种思路去解决这个问题:
1.将CMD转化为UTF-8编码。
2.将Mingw由UTF-8编码经过转码为GBK编码交给cmd,
下面我分别对两种方案进行尝试:

解决问题方案一

· 查看我们cmd的编码环境 : (打开cmd并且输入命令chcp)cmd打开搜索框下搜索cmd即可
所以我们只需要修改这里的code page的值就可以了。(修改以前一般是936)
我们输入命令:
chcp 65001
即可以将cmd从GBK/GB2312转化为UTF-8编码。
关于代码页的详细了解:
在这里插入图片描述
这个时候再编译代码即可看到中文:
在这里插入图片描述
但是这种解决方案他只能临时解决问题,一旦cmd关闭,系统自动重置chcp的值,则中文输出重新会变为乱码:

当然通过修改注册表的数值是可以达到永久修改chcp的值的:
在这里插入图片描述
具体操作如上图:打开注册表编辑器,然后再在这个目录下新建一个字符串,并且将其赋值为chcp 65001。

==============================================
这里应该是写到powershell下面,或者将vscode 的terminal端切换到cmd,具体可以看:如何在powershell中修改编码默认值

解决问题方案二

我们可以修改mingw的输出,让它在编译时使用GBK编码输出,然后再让CMD去显示:(这里我们需要修改Vscode
的配置文件==>.json文件)
(.json的知识不在这里讲解)
在这里插入图片描述
将task.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捕获错误
        ],
    }]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

将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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/770879
推荐阅读
相关标签
  

闽ICP备14008679号