STM32F103 学习笔记 - VSCode C语言开发中文乱码问题原理与解决方案
一、乱码问题核心原理
VSCode环境下C/C++程序运行出现中文乱码的根本原因:程序运行调用的Windows CMD终端编码,与源文件的保存编码格式不匹配。
-
VSCode默认编码 :VSCode默认新建、保存文件的编码格式为UTF-8;
-
Windows CMD终端默认编码 :Windows CMD终端默认的活动代码页为936,对应编码格式为GBK,其中GB2312为GBK的向下兼容子集;
-
编码冲突:当UTF-8编码的源文件包含中文内容,通过GBK编码的CMD终端输出时,因编码解析规则不一致,最终出现乱码。
二、解决方案
以下提供3种可落地的解决方案,均基于「统一文件编码与终端编码」的核心逻辑实现。
方案1:单文件临时修改编码格式
适用场景
仅需解决单个源文件的中文乱码问题,不影响其他文件的编码配置。
操作步骤
-
打开目标C源文件,点击VSCode右下角状态栏的编码格式标识(默认显示
UTF-8); -
在弹出的选项中选择「通过编码重新打开」,搜索并选择
GBK编码; -
保存修改后的文件,使用快捷键
F6运行程序,验证中文输出正常。
优缺点
-
优点:操作简单,配置仅作用于当前文件,不影响全局编码设置;
-
缺点:仅单文件生效,若新增含中文的源文件,需重复执行相同操作,批量场景下操作繁琐。
方案2:修改VSCode全局默认文件编码
适用场景
长期在Windows CMD环境开发,需所有新建源文件默认使用GBK编码,避免重复配置。
操作步骤
-
打开VSCode设置界面,可通过快捷键
Ctrl+,快速唤起,或点击左下角齿轮图标选择「设置」; -
在设置搜索框中输入
files.encoding,找到对应配置项; -
将默认值
UTF-8修改为GBK,配置自动生效; -
新建C源文件,验证右下角状态栏默认编码为
GBK,编写含中文的代码并运行,确认输出正常。
注意事项
该配置仅对修改后新建的文件生效,已创建的历史文件编码不会被自动修改。
方案3:修改CMD终端默认编码为UTF-8(注册表方式)
适用场景
希望保留VSCode默认UTF-8编码规范,从终端侧统一编码格式,适配跨平台开发习惯。
核心原理
通过修改Windows注册表,实现每次打开CMD终端时,自动执行CHCP 65001命令,强制将终端编码设置为UTF-8(代码页65001对应UTF-8编码)。
操作步骤
-
使用快捷键
Win+R唤起运行窗口,输入regedit回车,打开注册表编辑器; -
在注册表左侧导航栏,定位到路径:
HKEY_CURRENT_USER\Software\Microsoft\Command Processor; -
右键
Command Processor文件夹,选择「新建」→「字符串值」,将字符串名称设置为AutoRun; -
双击新建的
AutoRun字符串,在「数值数据」栏输入CHCP 65001 >nul,点击确定保存;-
>nul作用为屏蔽命令执行的控制台输出,避免打开CMD时显示代码页修改提示; -
65001为Windows系统中UTF-8编码对应的活动代码页编号。
-
-
重新打开CMD终端,输入
CHCP命令,验证返回结果为活动代码页: 65001; -
回到VSCode,使用默认UTF-8编码编写含中文的C程序,运行后验证中文输出正常。
风险提示与便捷操作
-
风险提示:注册表修改不当可能导致系统异常,新手不建议手动修改注册表;
-
便捷操作:可直接使用预编写的注册表文件实现一键配置/还原:
-
启用UTF-8编码:双击导入对应reg文件,自动添加上述
AutoRun配置; -
还原默认配置:双击导入还原用reg文件,自动删除
AutoRun配置,恢复CMD默认GBK编码。
-
三、编码底层补充说明
中文乱码的底层成因
-
字符存储规则差异:
-
1个中文字符在UTF-8编码中占用3个字节;
-
1个中文字符在GBK编码中占用2个字节。
-
-
解析错位:UTF-8编码保存的中文,被GBK规则按2字节为单位解析时,会出现字节错位、编码映射不匹配,最终显示为乱码字符。
英文无乱码的原因
英文字符在UTF-8与GBK编码中,均遵循ASCII编码规范,1个英文字符占用1个字节,且编码值完全一致。因此无论使用UTF-8还是GBK编码解析,英文字符都能被正确识别,不会出现乱码。