每个程序员都绕不过去的坎,而且一直如影随形。看上去很小的问题,但折腾起来很费时间。因为编码在输入、处理、输出这一系列的过程中,涉及的环节太多了,任何一环不一致,都可能导致现实乱码。
本来我都学聪明了,经历过那么多坑。我将所有字符集都使用utf8,这样就不会有乱码啦。可惜事与愿违。现在又让我赶上了。
事情起因是这样的。我使用云服务器CentOS系统,默认字符集en_US.utf8,我用win7上的notepad++做编辑器,也是设置为utf8,使用putty远程上去makefile,然后运行。putty也设置的是utf8,但printf打印的中文是乱码。
我觉得很奇怪啊,c程序不管什么字符集的啊,它眼里只有二进制数据啊。我从开始到最后全部用的utf8编码,在什么地方出岔子?我把中间过程的字符串按字节打印出来,又把代码文件中字符串用16进制view查看,分别对照比较,并看他的ansi、utf8分别是什么值。这种看内存中值是什么,以及怎么变化的,让乱码无处藏身。慢慢我就找到原因:代码中的常量字符串,它居然是ansi的! 也就是gb2312编码。我在win7上用notepad++,然后ftp连上centos编辑代码,定义的字符串常量居然是ansi的!!我iconv转成utf8后printf就OK了
对付乱码的问题,首先是基本知识要搞清楚,字符集的概念;然后是各个环节的转换,要保持一致,出现问题逐步排查,看是哪个环节出现问题。