STM32 VSCode 开发-C语言程序运行后,终端中文乱码

STM32F103 学习笔记 - VSCode C语言开发中文乱码问题原理与解决方案

一、乱码问题核心原理

VSCode环境下C/C++程序运行出现中文乱码的根本原因:程序运行调用的Windows CMD终端编码,与源文件的保存编码格式不匹配。

  1. VSCode默认编码 :VSCode默认新建、保存文件的编码格式为UTF-8

  2. Windows CMD终端默认编码 :Windows CMD终端默认的活动代码页为936,对应编码格式为GBK,其中GB2312为GBK的向下兼容子集;

  3. 编码冲突:当UTF-8编码的源文件包含中文内容,通过GBK编码的CMD终端输出时,因编码解析规则不一致,最终出现乱码。

二、解决方案

以下提供3种可落地的解决方案,均基于「统一文件编码与终端编码」的核心逻辑实现。

方案1:单文件临时修改编码格式

适用场景

仅需解决单个源文件的中文乱码问题,不影响其他文件的编码配置。

操作步骤
  1. 打开目标C源文件,点击VSCode右下角状态栏的编码格式标识(默认显示UTF-8);

  2. 在弹出的选项中选择「通过编码重新打开」,搜索并选择GBK编码;

  3. 保存修改后的文件,使用快捷键F6运行程序,验证中文输出正常。

优缺点
  • 优点:操作简单,配置仅作用于当前文件,不影响全局编码设置;

  • 缺点:仅单文件生效,若新增含中文的源文件,需重复执行相同操作,批量场景下操作繁琐。

方案2:修改VSCode全局默认文件编码

适用场景

长期在Windows CMD环境开发,需所有新建源文件默认使用GBK编码,避免重复配置。

操作步骤
  1. 打开VSCode设置界面,可通过快捷键Ctrl+,快速唤起,或点击左下角齿轮图标选择「设置」;

  2. 在设置搜索框中输入files.encoding,找到对应配置项;

  3. 将默认值UTF-8修改为GBK,配置自动生效;

  4. 新建C源文件,验证右下角状态栏默认编码为GBK,编写含中文的代码并运行,确认输出正常。

注意事项

该配置仅对修改后新建的文件生效,已创建的历史文件编码不会被自动修改。

方案3:修改CMD终端默认编码为UTF-8(注册表方式)

适用场景

希望保留VSCode默认UTF-8编码规范,从终端侧统一编码格式,适配跨平台开发习惯。

核心原理

通过修改Windows注册表,实现每次打开CMD终端时,自动执行CHCP 65001命令,强制将终端编码设置为UTF-8(代码页65001对应UTF-8编码)。

操作步骤
  1. 使用快捷键Win+R唤起运行窗口,输入regedit回车,打开注册表编辑器;

  2. 在注册表左侧导航栏,定位到路径:HKEY_CURRENT_USER\Software\Microsoft\Command Processor

  3. 右键Command Processor文件夹,选择「新建」→「字符串值」,将字符串名称设置为AutoRun

  4. 双击新建的AutoRun字符串,在「数值数据」栏输入CHCP 65001 >nul,点击确定保存;

    • >nul作用为屏蔽命令执行的控制台输出,避免打开CMD时显示代码页修改提示;

    • 65001为Windows系统中UTF-8编码对应的活动代码页编号。

  5. 重新打开CMD终端,输入CHCP命令,验证返回结果为活动代码页: 65001

  6. 回到VSCode,使用默认UTF-8编码编写含中文的C程序,运行后验证中文输出正常。

风险提示与便捷操作
  • 风险提示:注册表修改不当可能导致系统异常,新手不建议手动修改注册表;

  • 便捷操作:可直接使用预编写的注册表文件实现一键配置/还原:

    1. 启用UTF-8编码:双击导入对应reg文件,自动添加上述AutoRun配置;

    2. 还原默认配置:双击导入还原用reg文件,自动删除AutoRun配置,恢复CMD默认GBK编码。

三、编码底层补充说明

中文乱码的底层成因

  1. 字符存储规则差异

    • 1个中文字符在UTF-8编码中占用3个字节;

    • 1个中文字符在GBK编码中占用2个字节。

  2. 解析错位:UTF-8编码保存的中文,被GBK规则按2字节为单位解析时,会出现字节错位、编码映射不匹配,最终显示为乱码字符。

英文无乱码的原因

英文字符在UTF-8与GBK编码中,均遵循ASCII编码规范,1个英文字符占用1个字节,且编码值完全一致。因此无论使用UTF-8还是GBK编码解析,英文字符都能被正确识别,不会出现乱码。

相关推荐
smallcelebration2 小时前
132 docker入门学习
学习·docker·容器
代码缝合怪2 小时前
解决新版 VSCode 无法 ssh 连接 WSL Ubuntu18.04的问题
ide·vscode·ssh·ubuntu18
HalvmånEver2 小时前
MySQL表的查询(二)
linux·数据库·学习·mysql
南境十里·墨染春水2 小时前
C++笔记——STL list
c++·笔记·list
彷徨而立2 小时前
【C/C++】在头文件中定义全局变量的方法
c语言·开发语言·c++
今天你TLE了吗2 小时前
HelloAgents学习:PartⅠChapterⅠ初识智能体
人工智能·笔记·学习·agent·智能体
我不是懒洋洋2 小时前
手写一个跳表:从原理到Redis级实现
c语言
小茴香3532 小时前
React学习笔记(一)
笔记·学习·react.js
我想我不够好。2 小时前
4.27消防监控学习 1.30min
学习