首页 > 代码库 > 探讨java乱码
探讨java乱码
很多java初学者都遇到过乱码问题,也有很多人为此苦恼,下面来总结一下。
为什么要编码?
首先计算机只会识别二进制码,但是我们平时使用的都是字符(英文,中文,其他...)。所以,这期间就涉及到了字符与字节之间的转化过程。而这个过程(字节->字符,字符->字节)就是编码和转码!
有哪些编码类型?学过计算机的应该都知道
ASCII编码:是目前计算机中用得最广泛的字符集和编码。使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
ISO8859-1:可以表示的是西欧语言。看起来很单一为什么还在使用呢,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO-8859-1编码来表示。 而且在很多协议上,默认使用该编码。问题是不支持中文编码,会导致乱码。
GB2312:它是双字节编码,总的编码范围是A1~E7,其中A1~A9是符号区,总共包含682个符号;B0~F7是汉字区,包含6763个汉字。
GBK:GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。
UTF-16:UTF-16是Unicode的其中一个使用方式。Unicode是java和xml的基础。UTF-16具体定义了Unicode的转化格式,它使用定长的表示方法,既不论什么字符都可以用两个字节来表示。两个字节就是16个bit,所以叫做UTF-16。UTF-16表示字符非常方便,每两个字节表示一个字符,这就大大简化了字符串的操作,这也是java以UTF-16作为内存的字符存储格式的很重要的原因。
UTF-8:UTF-16统一采用两个字节来表示一个字符,虽然在表示上非常简单!方便!但是也有缺点。有很大一部分字符用一个字节就可以表示的,但是现在用两个字节表示,存储放大一倍!网络带宽有多利用了一倍。所以就有了UTF-8,它是一种变长的技术,每个编码区域有不同的字码长度。不同的字符可以有1~6个字节来组成。
当然还有一些其他的编码,我们在此就不再一一讲述了。
上面的后四种编码,都是可以对中文进行处理,而这四种里面推荐大家使用的gbk和utf-8,如果使用其他编码的话,很可能会出现一些其他的问题。
乱码是由什么原因引起的?
如果字符在保存时的编码格式和要显示的编码格式不一样的话,就会出现乱码问题。比如使用gbk编码,然后使用utf-8解码。平时我们在开发的时候,经常提倡开发环境编码一致。例如页面编码,数据库编码等。有些java视频教程里面讲的是不需要进行数据库编码,这样也会有问题的,所以要注意设置数据库中的编码。
Java在运行期一律以Unicode来存储字符,这样有利的支持了多语言环境。我们在开发过程中经常会用到文件读取。Java读文件的时候会用到系统默认的编码来解码文件。所以在用FileInputStream类读取文件可以指定编码读取。
JSP页面乱码通常只要在页面开始地方用下面代码指定字符集编码即可。如果还不行,那么请用下面这句话来转换 str=new String(str.getBytes("ISO-8859-1"),"页面编码方式");
JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如:
String str=new String(str.getBytes("开发环境编码"),"ISO-8859-1");
经过网络编码后的中文,要正确显示在页面上必须要用类似于
Stirng str=new String(str.getBytes("ISO-8859-1"),"开发环境编码");这样的方式来解码
最后,为了避免不必要的java中文乱码,我们首先要从源头做起。
什么意思呢?这就是说,我们在项目开发中,首先要让我们开发环境统一编码。比如我用的开发环境是Eclipse+Tomcat6.0+mysql。Eclipse的项目属性中可以设置项目的编码,可以针对JSP页面的设置统一的编码。
希望大家看完这篇文章后就再也不会惧怕乱码问题了,其实问题不可怕,了解了其中的原理就可以解决了。
文章转发自网络
探讨java乱码