前阵子我表弟给我发微信,语气特别急:“哥,我这电脑是不是中毒了?DEVC中文乱码,我打印个‘学生成绩管理系统’,结果出来一堆‘瀛︾敓鎴愮哗绠$悊绯荤粺’,老师明天要检查!”我让他把代码发过来,又让他截了图,代码逻辑没问题,printf("学生成绩管理系统\n"); 写得规规矩矩,问题出在他新建文件时用了UTF-8编码,而Dev-C++运行窗口和Windows控制台默认还是GBK那一套,两边“语言不通”,中文就被翻译成了火星文。
这件事特别典型,很多刚学C语言的人第一次遇到DEVC中文乱码,第一反应是软件坏了、电脑中毒了、编译器有bug,甚至有人把Dev-C++卸了重装三四遍,可乱码往往不是程序算错了,而是“文字在传输路上被换了衣服”,你写进去的是中文,编译器按一种编码理解,控制台又按另一种编码显示,最后看到的就是一堆看不懂的符号,说白了,乱码不是玄学,是编码链条没有对齐。
我后来让表弟做了三件事:先看源文件编码,再把文件另存为ANSI/GBK,最后重新编译运行,他半信半疑地操作完,窗口里终于正常出现了“学生成绩管理系统”,他跟我说:“原来不是电脑坏了啊。”我回他:“对,是编码没谈拢。”
其实DEVC中文乱码常见的不止一种,第一种是编辑器里中文变乱码,比如注释、字符串写着写着成了问号或奇怪符号;第二种是编译能过,但运行窗口输出中文乱码;第三种是换一台电脑打开同一个.cpp文件,昨天还正常的注释今天全变样,前两种多半和源文件编码、控制台代码页有关,第三种通常是团队或宿舍电脑之间编码设置不统一,别小看这件事,一个课程设计里如果有中文菜单、中文提示、中文注释,编码不统一能把人折腾一下午。
我自己以前也踩过坑,有一次帮朋友改一个Dev-C++的小项目,他的代码在他电脑上运行正常,到我电脑上输出中文就乱码,我一开始以为是编译器版本不同,后来发现他的源文件是GBK,我的Dev-C++默认新建文件是UTF-8,控制台又是另一个状态,我们俩对着同一段代码,看到的却是两个世界,那次之后我就养成了一个习惯:拿到别人的C/C++文件,先确认编码,再谈逻辑,尤其是教学环境里,大家用U盘拷来拷去、用微信传文件,编码被转来转去太正常了。
解决DEVC中文乱码,我一般不推荐一上来就背一堆参数,而是先判断问题在哪,如果只是控制台输出乱码,可以试试把源文件另存为ANSI/GBK,然后重新编译运行;也可以在Dev-C++的编辑器选项里把默认编码调成和你的运行环境一致,如果想让源文件保持UTF-8,就要注意控制台代码页,比如在Windows命令行里用chcp 65001切到UTF-8,但这会影响当前窗口,适合临时测试,还有人会在编译选项里加-fexec-charset=GBK之类的参数,让程序执行时的字符集和控制台匹配,方法不止一种,关键是别东改一下西改一下,最后自己都不知道文件到底是什么编码。
这里我想说个个人观点:DEVC中文乱码这件事,表面上是软件问题,实际上是“编码意识”的问题,很多教材和课程默认学生会用Dev-C++,却很少花十分钟讲清楚源文件编码、编译器字符集、控制台代码页之间的关系,结果学生一遇到乱码就复制网上的偏方,今天改这里,明天加那个参数,问题暂时好了,下次换台电脑又懵,与其这样,不如一开始就建立一个原则:一个项目里,源文件编码尽量统一;交作业前确认运行环境;如果老师要求用Dev-C++,就把常用设置固定下来,别每次新建文件都靠运气。
我也不觉得Dev-C++本身一无是处,它轻量、启动快,很多学校机房还在用,初学者写个循环、数组、结构体确实够用,但如果你长期写代码,我还是建议慢慢过渡到更现代的编辑器或IDE,至少编码设置、终端显示、插件生态会更省心,工具老不老不是原罪,最怕的是我们被工具的小毛病消耗掉学习热情,一个中文乱码就让初学者怀疑自己不适合编程,那就太可惜了。
下次再遇到DEVC中文乱码,别急着重启电脑,也别急着卸载软件,先问自己三个问题:我的源文件是什么编码?我的运行窗口是什么编码?我有没有在中间改过文件?把这三件事捋顺,很多乱码就能当场破案,代码世界里的中文并没有消失,它只是在等你把编码这扇门打开。
