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编码解析,英文字符都能被正确识别,不会出现乱码。

相关推荐
薛定猫AI19 小时前
【深度解析】从 Antigravity 更新看 Agent IDE 的工程化演进:权限、沙盒、MCP 与模型治理
前端·javascript·ide
凉、介1 天前
Armv8-A virtualization 笔记 (二)
笔记·学习·嵌入式·arm·gic
不做无法实现的梦~1 天前
SBUS 接收机到 STM32:为什么要做硬件反相、如何解析数据、如何接线与实现代码
stm32·单片机·嵌入式硬件
一路往蓝-Anbo1 天前
第二章:隔离硬件 —— 利用 CMock 伪造 GPIO 与定时器
stm32·单片机·嵌入式硬件·软件工程·信息与通信·tdd
智者知已应修善业1 天前
【ICL8038芯片正弦波三角波方波发生器电路】2024-1-5
驱动开发·经验分享·笔记·硬件架构·硬件工程
JoneBB1 天前
ABAP Webservice连接
运维·开发语言·数据库·学习
探序基因1 天前
身高与基因的关系
笔记
嵌入式小企鹅1 天前
UiPath推出AI编程“总指挥台”,SiFive发布RISC-V第三代猛兽
人工智能·学习·google·程序员·ai编程·risc-v·开源工具
Ada大侦探1 天前
新手小白学习数据分析03----Excel 报表之大厂周报(2026最新版实操,包教包会!)
学习·数据分析·excel
我星期八休息1 天前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法