在JSP开发中,经常出现乱码的问题。例如
<html>
<head>
<title> Untitle Document</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
以下的可能出现乱码:<br>
<%
out.println("这里是乱码");
%>
</body>
</html>
对于不同的web服务器和不同的JDK版本,它们处理的结果不一样。比如使用Tomcat4.03作为Web服务器,执行就出现乱码,但是如果使用Tomcat5.0 + JDK1.4.1 下运行这个页面,那么就不出现乱码。这个问题是由于服务器使用的编码方式不同和浏览器对不同编码字符显示结果不同而导致的。我们可以在浏览器里手工指定使用简体中文编码。这样,显示的字符就正常了。可是对于普通的客户来说,这种方式是不可行的。其实我们可以在JSP页面中指定编码的方式,以消除乱码。例如
<%page contentType="text/html;charset=gb2312"%>
<html>
<head>
<title> Untitle Document</title>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
</head>
<body>
指定编码方式,不出现乱码:<br>
<%
out.println("这里不出现乱码");
%>
</body>
</html>
在上面的原码中,使用编码格式为gb2312.这样对于不同的服务器和JDK,都不会出现乱码。
对于请求的表单中的数据,如果有中文,也会出现这个情况。例如
<%
out.println(request.getParameter("name"));
%>
如果传来的是中文,那么只需的结果将是乱码。如果执行结果的页面也是gb2312,那么显示出来的就是问号(?)
这是因为浏览器默认使用UTF-8编码方式发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符的错误。这样可以通过一个字符编码的函数来解决,就是把请求通过iso-8859-1来编码,例如
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import=java.io.*%>
<%
String result = null;
byte temp[];
try{
temp = chi.getBytes("iso-8859-1");
result = new String( temp );
}catch(UnsupportedEncodingException e){
System.out.println( e.toString() );
}
return result;
catch(){}
%>
<%
out.println(request.getParameter("name"));
%>
通过以上的转换,问题基本解决。但是耗费很大的力气。其实有个简单方法。如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%
request.setCharacterEncoding("gb2312");
out.println(request.getParameter("name"));
%>
注意:对于一些最新的服务器,它们可能不需要做任何处理就可以正常显示中文,比如Tomcat5.0。但是对于某些服务器或者其他比较老的版本,还需要使用上面介绍的方式来进行字符转换。