Java中的乱码问题



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程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,JavaJSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。首先Java(包括JSP)源文件中很可能包含有中文,而JavaJSP源文件的保存方式是基于字节流的,如果JavaJSP编译成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");编码后解码

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值