jsp乱码问题-java与mysql的字符集统一

 

jsp乱码问题-java与mysql的字符集统一

 

 



1、在jsp中,字符集由<%@ page language=”java” contentType=”text/html;charset=GBK”%>来指定,如果处理中文,需指定为gbk。所以提交的数据全部都使用gbk编码;

2、在java中,从jsp提交过来的数据是gbk编码的,而java默认的处理方式是使用ISO-8859-1编码,所以若在java中能显示jsp提交过来的gbk编码方式的数据,就要进行一个转换:将gbk转换为ISO-8859-1,这样数据就可正常显示。

3、如果要将jsp提交的数据经过java后台处理,然后放入数据库中,就又多了一个数据编码方式:数据库的数据编码方式。以mysql为例,默认字符集为latin,所以若将gbk的数据放入,必然出现乱码,所以首先应改变数据库的编码方式为gbk。


综上,简单的设置方法如下:



jsp(gbk) —->java(ISO-8859-1) —> mysql(gbk)

还有一种情况会出现乱码:当你在jsp端提交一个id号,然后在java处理端通过id号得到数据库中的gbk(汉字)数据,这是就会出现乱码,因为java处理的是ISO-8859-1,你在java到mysql中有了一个ISO-8859-1到gbk的转换,而这些数据本身就是ISO-8859-1,所以转换后就出现问题了。

解决办法:将在java中处理的gbk数据转换为ISO-8859-1即可。


总之:在jsp,java,mysql三者之间的编码方式必须统一,不能错误的转换或者不转换。

一些相关转换函数:

1、String 到 Unicode


public static String toUTF(String inPara){
//将字符串转换成Unicode编码
char temChr;
int ascChr;
int i;
String rtStr=new String(“”);
if(inPara==null){
inPara=””;
}
for(i=0;i<inPara.length();i++){
temChr=inPara.charAt(i);
ascChr=temChr+0;
String z=””;
String hex=Integer.toHexString(ascChr);
// ————如果不够四位则高位补零——————
for(int j=0;j<4-hex.length();j++)
{
z+=”0”;
}
//System.out.println(ascChr);
//System.out.println(Integer.toBinaryString(ascChr));
rtStr=rtStr+”&#x”+z+hex+”;”;
}
return rtStr;
}

2、String 到 ISO-8859-1


public static String to8859(String s){
String str=s;
try{
byte b[]=str.getBytes(“ISO-8859-1”);
str=new String(b);
return str;
}
catch(Exception e){return null;}
}


3、gbk 到 latin1

public  static  String  tolatin1(String  strChinese)
{
try
{
return new String(strChinese.getBytes(“gbk”),”latin1”);
}catch( Exception e)
{
return “”;
}
}

解决方法一:(最重要的一种方法)
你看下my.ini,有无
[mysql]

default-character-set=utf8

[client]
default-character-set=utf8

[mysqld]
default-character-set=utf8

然后建立表时,也要用(比如)
DROP   TABLE   IF   EXISTS   Company;
CREATE TABLE IF NOT EXISTS Company
(
Cname VARCHAR(10) NOT NULL,
Caddr VARCHAR(100),
Ctel VARCHAR(16)
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

这样就没问题。

如果是jsp要声明:
contentType=”text/html;charset=gb2312”

解决方法二:

连接mysql时(无论在从mysql读还是取数据的情况),指定使用的编码方式为utf-8,具体代码如下
//装载mysql-jdbc驱动

Class.forName(“com.mysql.jdbc.Driver”).newInstance();

//连接数据库

Connection sqlCon = DriverManager.getConnection( “jdbc:mysql://localhost:3306/test? user=root&password=1&useUnicode=true&characterEncoding=utf-8” );

解决方法三:

如果方法一不行那么在方法一的基础上对读入的字符串进行强制编码方式转换。

代码示例如下:
String name = rst.getString(“name”);
name= new String(name.getBytes(“ISO-8859-1”),”utf-8”);

注:代码也可以为:
String name =new String( rst.getString(“name”).getBytes(“ISO-8859-1”),”utf-8”));

其中rst为返回的resultset,ISO-8859-1为mysql默认的编码方式,代码的目的是把以ISO-8859-1的编码转换为gb2312编码方式,这样强制转换,可以解决一部分问题,如果结合方法一,应该可以解决中文乱码问题。

解决方法四:

这个方法在有些文章里是首推的,我首先也是试了这个方法,但是好像不行。这里还是说一下,不知是不是我操作错误。还是先贴原文吧:

“如果数据库中有中文的话而mysql默认的语言不是中文时要在配置文件C:winntmy.ini 中的 [mysqld] 里添加一行:
default-character-set=utf-8

然后重起mysql


可以在你的loginservlet.java中加入
request.setCharacterEncoding(“gb2312”);

或者:
String sUserName = new String(request.getParameter(“txtUserName”).getBytes(“ISO-8859-1”),”gb2312”);