Java中的乱码问题
在解决乱码问题之前我想让大家明白一件事:为什么程序或者数据库会出现乱码?
因为编码和解码的方式不统一
在解决乱码问题前,我们还要对八种基本数据类型有足够的了解
下面让我们来认识一下这八种基本数据类型吧:
类型 | 所占内存 | 适用范围 | 对应包装类 |
byte | 1字节 | -128~127 | Byte |
short | 2字节 | -3w-3w | Short |
int | 4字节 | 2的32次方 | Integer |
long | 8字节 | 2的64次方 | Long |
float | 4字节 | 3.4*10^38 | Float |
double | 8字节 | 1.7*10^308 | Double |
char | 2字节 | 0~65535 | Character |
boolean | 1位 |
| Boolean |
以上就是我们平时常用基本数据类型
下面来看一下我们需要了解的几种编码方式吧
1>ISO8859-1 也叫Latin-1,属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。ISO8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用ISO8859-1编码来表示。
2>Unicode编码:包含世界上所有的字符,是一个字符集。是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容ISO8859-1编码的,也不兼容任何编码。
3> GB2312/GBK/GB18030 :是汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO8859-1一致(兼容ISO8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。GB18030表示繁体中文。
4>UTF系列:考虑到unicode编码不兼容ISO8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容ISO8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。
UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度。
BIG:是台湾的大五码,用来表示繁体汉字
能用到的几种编码方式介绍完了,下面来分析一下,出现乱码的原因吧。
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312或-ecoding UTF-8编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或
<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。
字符(char)类型:用单引号‘’,只能放一个字符,char类型使用Unicode编码存储,字母,符号占一个字节,汉字占三个字节。
字符串(String)类型:用双引号“”,可以存放多个字符。字母,符号占一个字节,汉字占两个字节。
以大家经常使用的编码为例:
汉字使用utf-8存储时,一个汉字占3个字节,使用gbk存储时一个汉字占两个字节,所以他们之间的转化一定会出现乱码。
utf-8编码可以用gbk和iso8859-1解码后编回去
gbk编码后只能用iso8859-1解码后编回去
在JSP页面获取表单的值时会出现乱码,有两种解决方法:
1.在调用getParameter之前通过request.setCharacterEncoding设置字符编码
2.调用new String(str.getBytes("iso8859-1"), "UTF-8");编码后解码