天天看点

字符编码和中文乱码

记得刚使用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编码,网页上也要加上这样一句。

1.  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />      

还有个需要注意的地方,就是当你使用的数据库是mysql时,默认的字符通信方式是ISO8859-1,你需要加上这样一句,来让通信字符也变为GBK,这样就能在网页上正常显示出汉字了。

1. mysql_query
    (
    'set names gbk'
    )
    ;