java 编码 UTF-8、ISO-8859-1、GBK 【转】

java 编码 utf-8、iso-8859-1、gbk

java支持utf-8、iso-8859-1、gbk等各种字体编码,可笔者发现java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在java中如何正确显示中文的文章,但都不够全面,笔者特意总结如下。

影响java中字体编码正确显示的有几个因素: 1)数据库的连接方式; 2)网页中使用的字体编码; 3)数据库里存放数据的字体编码; 4)java的缺省字体编码。如果在编程中遇到不能正确显示中文时,要先弄清楚以上几项所使用的字体编码,再分析找出原因,即可解决问题。

众所周知,jsp是java的一种,和网页有关,而网页也有自己的中文编码系统,所以jsp处理中文要比纯java的类文件更为麻烦。本文的测试数据库是mysql3.2,数据库连接驱动是用org.gjt.mm.mysql.driver,这里主要讨论utf-8和gbk的显示( gb2312是gbk的一个子集,java中可以使用gbk来代替gb系列)。我们先来研究jsp中字体编码问题,下面第一到第六点是针对jsp的(因为从数据库里读出中文数据与写入中文数据有所区别,咱们分别说明,前三点是从读取数据库到显示在网页,后三点是从网页输入数据到存入数据库),第七到第九点针对纯java的类文件。以下rs表示resultset的一个实例,是执行select语句之后产生的数据集。

一、数据库连接方式使用utf-8

在连接数据库的驱动后面加上这句参数useunicode=true&characterencoding=

utf-8,例如jdbc:mysql://localhost/dbvf?autoreconnect=true&useunicode=

true&characterencoding=utf-8,从数据库里读出中文显示在使用gbk的jsp的网页里,如果数据库里存放的字体编码是utf-8,在jsp中使用 str=new string(rs.getbytes(1),"utf-8")或者str=rs.getstring(1),可以正确显示中文。如果数据库里存放的是 gbk数据,那么jsp中也要使用str=new string(rs.getbytes(1),"gbk")来显示正确的中文。值得注意的是如果页面使用utf-8,数据库里存放的是utf-8,也可以用str=new string(rs.getbytes(1),"gbk")正确显示中文。如果网页是utf-8,而数据库里存放的是gbk,无法直接显示中文,需要2步转换, str=new string(rs.getbytes(1),"gbk"); 再str=new string(str.getbytes("utf-8"),"gbk"),才可以正确显示中文。

二、数据库连接方式使用gbk

在连接数据库的驱动后面加上这句参数useunicode=true&characterencoding=

gbk,例如jdbc:mysql://localhost/dbvf?autoreconnect=true&useunicode=true&

characterencoding=gbk,从数据库里读出中文,显示在使用gbk的jsp的网页里,如果数据库里存放的字体编码是 utf-8,在jsp中一定要使用 str=new string(rs.getbytes(1),"utf-8"),才正确显示中文。如果数据库里存放的是gbk数据,那么jsp中也要使用str=new string(rs.getbytes(1),"gbk") 或者直接使用str=rs.getstring(1),即可显示正确的中文。如果网页是utf-8,而数据库里存放的是gbk,只能用str=new string(rs.getstring(1).getbytes("utf-8"),"gbk")的方法来显示中文; 如果网页是utf-8,而数据库里存放的是utf-8,可用str=new string(rs.getbytes(1),"gbk") 或者rs.getstring(1)方法来显示中文。

三、使用缺省数据库连接方式

连接数据库的驱动后面没有这句参数useunicode=&characterencoding=,例如 jdbc:mysql://localhost/dbvf?autoreconnect=true,没有参数useunicode=true& characterencoding,表示使用默认的iso-8895-1编码。

1. 从数据库里读出中文,显示在gbk的网页里。如果数据库里存放的字体编码是utf-8,在jsp网页中一定要使用语句 str=new string(rs.getbytes(1),"utf-8") 或者str= new string(rs.getstring(1).getbytes("iso-8859-1"),"utf-8"),才可正确显示中文。如果数据库里存放的是gbk数据,那么jsp中也要使用str=new string(rs.getbytes(1),"gbk")或str=new string(rs.getstring(1).getbytes("iso-8859-1"),"gbk") 显示正确的中文。

2. 如果网页是utf-8,不能直接正确显示gbk,需要2步转换,str=new string(rs.getbytes(1),"gbk"),再str=new string(str.getbytes("utf-8"),"gbk") 才可以正确显示中文。如果数据库里存的是utf-8,直接用str=new string(rs.getbytes(1),"gbk")或者str=new string(rs.getstring(1).getbytes("iso-8859-1"),"gbk")就可以显示中文了。

以上是读取数据库里中文正确显示在网页上,下面三点是如何正确存入数据库。

四、数据库连接方式使用utf-8编码

jsp中要把网页输入的中文存入数据库,通常有一个提交(submit)的过程,是用 str=request.getparameter("username"),然后执行update或者insert语句来存入数据库。如何赋值给str 很重要,而且这里中文输入与网页所使用的字体编码有关。

1、 网页使用utf-8,使用str= new string(request.getparameter("username").getbytes("iso-8859-1"),"utf-8")或者str= new string(request.getparameter("username").getbytes(),"utf-8"),都可以使得存到数据库里的数据是utf-8编码。

2. 网页使用gbk,使用str= new string(request.getparameter("username").getbytes(),"gbk"),那么存入数据库的是utf-8编码。

3. 值得注意的是使用utf-8的数据库连接方式不能存得gbk。

五、数据库连接方式使用gbk编码

1. 输入使用gbk网页,存到数据库里是gbk的方法: str= new string(request.getparameter("username").getbytes("iso-8859-1"),"gbk") 或者str= new string(request.getparameter("username").getbytes(),"gbk")。

2. 网页使用gbk,想存入utf-8到数据库里,要分2步: 先str=new string(request.getparameter("username").getbytes(),"gbk"),再str=new string(str.getbytes("utf-8"),"gbk")即可。

3. 网页使用utf-8,而且使用str= new string(request.getparameter("username").getbytes("iso-8859-1"),"gbk") 或者str= new string(request.getparameter("username").getbytes(),"utf-8"),那么存到数据库里的数据是 utf-8编码。

4. 网页使用utf-8,而且使用str= new string(request.getparameter("username").getbytes("iso-8859-1"),"utf-8"),那么存到数据库里的数据是gbk编码。

六、数据库连接方式使用缺省,即不使用参数useunicode和characterencoding

1. 网页使用gbk,如果使用str= request.getparameter("username")或者str= new string(request.getparameter("username").getbytes()),那么在数据库里的数据是gbk码。网页使用 utf-8 和使用str= request.getparameter("username"),则存入数据库是utf-8编码。

2. 如果使用str= new string(request.getparameter("username").getbytes("iso-8859-1")),那么根据网页提供的字体编码而存到数据库里,比如是utf-8的网页,那么存到数据库中就是utf-8编码,如果使用gbk网页,那么存到数据库里的字就是gbk编码。

3. 如果使用str= new string(request.getparameter("username").getbytes("utf-8"),"utf-8")这一种组合能存到正确的数据外,其他存到数据库里的数据则都是乱码或者错误码。在这个utf-8组合的特例中,网页使用的是gbk,则存放到数据库里就是gbk,网页使用utf-8,那么存到数据库里的就是utf-8。

4. 网页是gbk的要存得utf-8,一定需要2步: company=new string(request.getparameter("company").getbytes(),"gbk")和company=new string(company.getbytes("utf-8"))。

5. 网页是utf-8的,不能存得gbk在数据库里,一句话,改变数据库连接方式不能存得gbk码。

以上所有的都是基于jsp网页和数据库交换数据,下面讨论一下纯java编程下的字体编码转换。

七、数据库连接方式使用utf-8编码

1. 数据库里的中文是utf-8,可以转换为gbk,但不能把gbk存入数据库。

2. 数据库是gbk,如果转换为utf-8,使用content=new string(rs.getbytes(2),"gbk")直接将content存入数据库就可为utf-8。

八、数据库连接方式使用gbk编码

1. 数据库里的中文是utf-8,如果转换为gbk,使用content= new string(rs.getstring(2).getbytes(),"utf-8"),再直接使用update或者insert语句插入到数据库,即存得gbk。如果使用content= new string(rs.getstring(2).getbytes(),"gbk")或者content= new string(rs.getstring(2).getbytes()),再存入数据库即存得还是utf-8编码。

2. 数据库里的中文是gbk,如果转换为utf-8,使用content= new string(rs.getstring(2).getbytes("utf-8"))或者content= new string(rs.getstring(2).getbytes("utf-8"),"gbk"),再直接使用update或者insert语句插入到数据库,即存得utf-8。

3. 如果某个string是gbk,要转换为utf-8,也是使用content= new string(gbkstr.getbytes("utf-8"))或者content= new string(gbkstr.getbytes("utf-8"),"gbk"); 如果某个string是utf-8,要转换为gbk,应该使用new string(utfstr.getbytes("gbk"),"utf-8")。

九、数据库连接方式使用缺省,即不跟参数

1. str2=new string(gbkstr.getbytes("utf-8"),"iso-8859-1"),可以将数据库里的gbk编码转换为utf-8。

2. 读取utf-8然后存入utf-8,则用str1=new string(utfstr.getbytes(),"iso-8859-1")或者str1=new string(utfstr.getbytes("gbk"),"iso-8859-1")。

3. 不能实现数据库里的utf-8转换为gbk。

如果采用utf-8的数据库连接方式或者缺省数据连接方式,那么无法将utf-8转为gbk;而gbk的数据库连接方式可以实现utf-8和gbk的相互转换。建议大家采用gbk的数据连接方式。

参考链接:

深入剖析java编程中的中文问题及建议最优解决方法

http://fafeng.blogbus.com/logs/3062998.html (1)

http://fafeng.blogbus.com/logs/3063006.html (2)


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值