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也就是什么编
码,而不是像网上说的
发布评论