记得刚使用ubuntu的时候,处理各种乱码神马的都是很麻烦的事情,后来开始写一些web程序的时候,中文编码的问题还是会不断的出现,于是对于web程序员来说,字符集编码已经是十分常见的问题了,但是如果不去系统的了解下,处理问题时还是会有些棘手的,这篇文章我就打算简单的介绍下这些问题。
最初学习计算机的话,首先接触的便是ASCII编码了,0是48,a是97啥的估计大家都记得很清楚吧,计算机中以8bit为一个byte,于是一个byte能表示256个数,ascii是用一个字节,并且第一位是0,也就是说只用了7个bit,于是ASCII只有128种表示,这对于英文系统是最够的了。但是欧洲很多字母和英文字母很不相同,于是为了扩展,第一位也纳入使用,这样就是ISO8859-1编码,又叫做latin-1,很多时候你不指定编码的时候,默认编码就是ISO8859-1,这是一个要注意的地方。
由于亚洲地区的文字不像欧洲那样用几个字母就可以了,于是亚洲各地区便有了自己的一些编码格式。对于中文编码而言,大家比较熟悉的就是GB2312编码,这是大陆地区推行的简体字的编码标准,而相应的台湾的繁体字用的是BIG5的繁体字编码,由于GB2312只有简体字,后来又进行了扩充,便有了GBK,他是GB2312的超集,就是说GB2312编码的字符,都可以用GBK的方式解读。后来又加入了少数民族的字体有了GB18030,不过这个貌似不如GBK应用广泛。
由于混乱的编码格式,造成了国际化的困难,于是便有了大有一统天下之势的unicode编码,对于各国文字符号等都会在unicode有一个统一的编码,但是unicode只是一种表示方式,但是却没有规定表示符号的这个数字应该如何在计算机上存储。而现在比较通行的存储方式是utf-8,utf-8是一种变长的编码方式。
所以对于中文字符而言,我们最常见的就是GBK和utf-8两种编码格式。对于windows而言用一种叫ANSI的编码格式,他是英文用ASCII编码,简体中文用GB2312编码,而linux等系统一般都会采用utf-8的编码方式,所以当你在linux下打开windows下的一些中文文本文件时会出现乱码的情况,就是因为本来应该是GB2312的编码方式,却用utf-8的格式来解读必然就会出现错误。
当写web程序时也要时刻注意编码的统一,也就是数据库里数据的编码,程序文件的编码,以及网页显示的编码(就是charset字段),以及他们之间的通信的编码方式。比如你是在windows写程序的话,默认的程序编码就是GBK,为了统一,你需要数据库也要改为GBK编码,网页上也要加上这样一句。
还有个需要注意的地方,就是当你使用的数据库是mysql时,默认的字符通信方式是ISO8859-1,你需要加上这样一句,来让通信字符也变为GBK,这样就能在网页上正常显示出汉字了。
mysql_query('set names gbk');
不过一般情况下还是推荐统一的去使用utf-8编码,一个原因是utf-8是一种大势所趋,另一个原因是现在大部分服务器都是linux,所以utf-8会有更好的兼容性。一般写程序时,处理字符的时候先把utf-8转成unicode来进行处理,因为unicode是定长的,所以当你转unicode之后,统计字的个数时也非常方便,然后当需要输出或者存储时在转换成utf-8方式,应该说这样的处理是一种很好的方式。
扩展阅读:
http://blog.jobbole.com/18269/
http://blog.kongxz.com/2010/03/utf8-iso8859-gb-cp936-etc/
http://blog.alphatr.com/about-char-coding.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
http://blog.csdn.net/garybrother/article/details/3988741
这么巧,刚写了一个程序也是各种编码问题,嘿嘿,用活了,也不是什么大问题哈
@baiyang: 是啊,用熟了都不是问题阿
讲的非常清晰了,昨天用python处理windows中文字符的时候,总是出错,最后才知道是gbk编码的。早看了这篇文章就好了。有个疑问,gbk是gb2312的超集,gb18030是gbk的超集吗?
@webdancer: gb18030也是gbk的超集,如果不向下兼容就太坑了。。。