2024年5月9日发(作者:)

由一次诡异的codeblocks中文乱码想到的汉字编码知识

一、问题复现

1.用codeblocks新建一个1.c,里面写入:

#include "stdio.h"

main()

{

printf("中文");

}

保存,编译,可以正常显示。

关闭codeblocks,复制了一份1.c,改叫“1-对照.c”,再打开1.c,发现“中文”两

个字变成了乱码(是四个字母,好像是俄文)

2.用codeblocks新建一个2.c,里面写入:

#include "stdio.h"

main()

{

printf("为啥这样的中文可以");

}

保存,编译,可以正常显示。

关闭codeblocks,再打开2.c,发现一切正常。

二、思考

百思不得其解,遂查阅了大量关于汉字编码的文章。用winhex查看“1.c”(用

codeblocks再次打开过)和“1-对照.c”(没有用codeblocks再次打开过),发现两个

文件内码都一样,而且中文两个字的内码没有错,就是GBK对应的编码“D6D0 CEC4“。

于是我吐了。。。

”吐定思痛“,我怀疑是codeblocks的自动检测编码机制工作失误,查看了

codeblocks的状态栏,果然是将编码错认成了KOI8-R。为什么2.c没有错认呢?可能是

因为那几个字的机内码已经不在KOI8-R的范围内了,所以codeblocks正确的认成了GBK。

实际上,因为默认是Windows-936,所以刚新建文件时,editor界面显示正常,

保存时,也是用的ANSI编码(在简体中文win7上就是Windows-936就是GBK)

个人认为,源码是什么编码,gcc就认为是什么编码,生成的exe也就是什么编

码,而不是像网上说的