日期:2014-05-16  浏览次数:20426 次

java中处理字符编码(网页与数据库)
首先声明一下,此文章时从网上转载的。如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat跑的时候得用他说的方法,不过到了WebSphere的时候必须得用原先的
String name = request.getParameter("name");
所以采取本文方法的时候不要太死板,多试试。

在Java编程中,中文字体编码难倒了不少程序员,如果抓住了影响Java中文显示的几个关键因素,问题将迎刃而解。
Java是目前最流行的面向对象的编程语言之一,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/DBName?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. 网页使用GB