技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> 字符编码和中文乱码小叙

字符编码和中文乱码小叙

浏览:5704次  出处信息

记得刚使用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');

不过一般情况下还是推荐统一的去使用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


建议继续学习:

  1. 中文编码杂谈    (阅读:4988)
  2. Hadoop的map/reduce作业输入非UTF-8编码数据的处理原理    (阅读:4667)
  3. PHP编码规范    (阅读:4406)
  4. base64_encode 和 urlencode    (阅读:4130)
  5. UTF-8编码中BOM的检测与删除    (阅读:4083)
  6. Linux screen窗口中文乱码问题    (阅读:4008)
  7. Unicode与字符汉字相互转换    (阅读:3980)
  8. python-django的中文编码总结    (阅读:3846)
  9. JAVASCRIPT完美实现UTF8页面提交数据到GB2312    (阅读:3642)
  10. 自动检测字符编码函数mb_detect_encoding    (阅读:3597)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1