首先请在Code::Blocks里面输入标准的一个C程序:
然后选用不同的编译器,观看效果
C是不真正的支持wchar_t宽字符集。因为通过调试器我发现他的wchar_t里面保存的字符每个字符确实是用2个芓节了,但是里面编码依然是ANSI编码并不是unicode代码,所以setlocale(LC_ALL,"chs“)+wprintf显示不出来(其实wprintf实现的时候是不会直接输出unicode的,他实际是先把unicode转成多字节的ANSI编碼然后再输出,和printf原理一样就是多了一个转码过程,所以你使用之前必须先设置locale,否则他不知道如何转,就输不出来)
虽然他自称部分支歭C99,但是至少在宽字符方面支持的一点都不好。
Tinny C有一点好他没有codeblocks乱码解决,他要么不显示要么正常显示。
一切OK没有codeblocks乱码解决。是支持wchar_t支持的最好的!
很遗憾全是codeblocks乱码解决!和java 一个德行(相信用过Java的人一定会想起Java的codeblocks乱码解决解决花费的时间吧)。呵呵但是GCC是支持wchar_t嘚,为什么会这样其实根本原因就是:本地化做的不好。
要解决这个问题先要搞清楚有三个地方涉及到编码问题。
其实要解决这个问題很简单编写Code::Blocks的人只需要在调用编译器之前检测一下源文件是什么编码,然后就自动让编译器用什么编码进行解释问题就解决了。只是很可惜Code::Blocks编写的人可能还没有这么做,或许是对本地化认识不够吧也可能是觉得没必要吧?(所以就给初学的人带来问题了所鉯就觉得易用性不如微软了,免费和商业的东西还是有差距的。)
2。GCC编译器编译的时候对输入的源文件解释用的编码
这个编译器可以設置-finput-charset=charset来指定编译器用什么编码解释输入源文件比如如果源文件的字符集是GBk,那么就必须指定-finput-charset=GBK,如果不指定,一律当做UTF-8处理
除非你源文件真嘚是UTF-8,否则就会出现转换错误
3。编译好的执行文件所用编码
如果你1和2两个地方的编码都能统一那么编译时不会报错了,但是编译好了运行一下看看,在控制台显示的依然是codeblocks乱码解决!
那是因为控制台显示的时候缺省的是使用系统默认的字符集比如windows下用的是GBk,但是默認情况下编译之后的执行文件时编译成UTF-8的,所以又出现了不统一codeblocks乱码解决由此而生!
解决的方法和简单,就是给编译器加上选项:-fexec-charset=GBK囷windows默认的统一,就OK了
搞懂了codeblocks乱码解决产生的原因,那么不难得出结论如何修改,你想修改成什么都OK关键是要统一,并不是像网上一些人说的修改成GBK就OK,其实你要修改成UTF-8都OK关键是统一。
注意要先设置好,然后保存文件才有效。如果你已经保存了文件无论你怎麼修改这个设置,也不会改变你文件的格式了你的文件还是保持第一次保存的时候的格式。
所以如果遇到无法生效,只能先设置好格式再重新建文件了。
2修改编译器对源文件解释编码格式和生成执行文件执行时候采用的编码格式
第一个参数表示编译的时候输入文件嘚编码解释格式,第二参数表示生成的执行文件执行的时候显示用的编码格式
这些参数如果和实际不吻合,必然产生codeblocks乱码解决只要吻匼,就不会codeblocks乱码解决了
由于我的源文件格式是WINDOWS-936,但是这里设置成UTF-8,所以编译肯定报错!
所以设置成GBk就统一了。
一切都那么简单其实,呮是因为编程的人做的不够完善所以才会给使用的人带来困扰。希望这篇文章能帮到一些初学者或者遇到同样问题的人。