Keil5中文乱码不是Bug,是编码世界的一场“方言误会”
你刚新建一个工程,给文件起名“电机控制_v1.0”,结果在Keil5工程树里看到的却是“?????_v1.0”;
你在main.c里认真写下// 初始化ADC通道:采集电池电压,编译后注释变成一串方块;
调试时串口打印出System init complete,可日志窗口却显示System init com̼plete——最后两个字母被撕裂成乱码。
这不是你的代码错了,也不是Keil5坏了。
这是Windows、C语言编译器、文本编辑器、字体渲染引擎和你自己,在同一块屏幕上,用不同的语言规则同时说话。
而Keil5,恰好站在所有这些“方言”的交汇路口,却没配翻译官。
为什么Keil5对中文这么“拧巴”?
先抛开术语,说人话:
Keil5本质上是个“老派Windows程序员”——它不自己造轮子,而是直接调用Windows系统API来读文件、画文字、打开路径。它的底层逻辑,至今仍深深扎根于上世纪90年代的ANSI时代。
这意味着:
- 它默认相信你写的文件是GBK编码(也就是CP936),因为这是简体中文Windows的“母语”;
- 它看到UTF-8文件时,只认一种“身份证”:BOM头(
0xEF 0xBB 0xBF)。没有这个三字头?对不起,一律当GBK处理; - 它的编辑器设置里,根本没有“GBK”这个选项——只有
System Default、UTF-8、UTF-16 LE/BE。而那个看似中立的System Default,其