1.第一个可能会出现中文乱码问题的是没有在JSP中指定页面显示的编码,就是在你写的jsp页面上没有指定编码规则,即:
<%@ page language="java" import="java.util.*" %>
(1).如果在MyEclipse中,你没写编码方式的话,将会弹出个对话框,要求你写上编码这个属性,在MyEclipse工具里创建的jsp页面首行默认是下面的代码:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
(2).如果jsp页面上有中文的话,保存下发现会不能完成,必须保存为utf-8格式,所以你刚开始创建此jsp页面时就直接把编码规则改成utf-8或GB2312,即:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<pre class="plain" name="code"><%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
2.第二个会出现中文乱码问题的是你使用了get方式提交表单,然后你提交的内容可能会出现乱码问题,在这里,我创建了一个ChineseTest Web Project,然后在WebRoot下创建了一个Myjsp1.jsp页面和一个result.jsp页面,接下来附上我所写的代码,来测试下使用get方式提交表单是否会出现中文乱码问题:
MyJsp1.jsp页面代码
<%@ page language="java" import="java.util.*" pageEncoding="GB2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'Zhuce.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,</strong>keyword2<strong>,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
JSP学习中
<form action="result.jsp" method="get" name="form">
<br/>用户名:<input type="text" name="username" value="李四"/>
<br/>密码: <input type="password" name="password"/>
<br/><input type="submit" value="注册" name="submit"/>
<input type="reset" value="重置" name="reset"/>
</form>
</body>
</html>
result.jsp页面代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'result.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String username=request.getParameter("username");
String password=request.getParameter("password");
out.println("用户名:"+username+"<BR>");
out.println("密码:"+password+"<BR>");
%>
</body>
</html>
然后运行MyJsp1.jsp页面,出现下面的界面:
出现此界面后,写上密码,点击注册按钮跳转到result.jsp页面,发现用户名出现了中文乱码:
解决办法为:将你提交的方式改为post,get提交方式会泄露一些内容并且出现中文乱码问题,所以建议大家提交表单时都用post方式。
改为post后就可以显示正常的中文了。
3.第三个会导致中文乱码问题的是从表单获取内容时,使用request.getParameter(“”)的方法,当表单中出现中文数据的时候就会出现乱码。
(1).解决方法一:request.setCharacterEncoding("utf-8"); 利用内置对象request来设置字符编码方式为utf-8;
此时,你运行jsp页面,你所通过resquest.getParameter(“”)方法获取的中文数据全部都能正常显示。
注:如果你使用的是request.setCharacterEncoding("GB2312"); 方法来设置字符编码的话,运行上面的MyJsp1.jsp页面,会出现像下图的中文乱码问题:
但是有可能你不会出现该中文乱码问题,我用这种方法试过很多次都会出现中文乱码问题,最好使用request.setCharacterEncoding("utf-8");来设置;
(2).解决方法二:可以在你获取表单内容后,用下面的代码来设置字符编码并直接输出获取到的内容:
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
out.println("用户名:"+new String(username.getBytes("ISO-8859-1"),"utf-8")+"<BR>");
out.println("密码:"+new String(password.getBytes("ISO-8859-1"),"utf-8")+"<BR>");
%>
或者能使用下面的代码:
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
String name=new String(username.getBytes("ISO-8859-1"),"utf-8");
String word=new String(password.getBytes("ISO-8859-1"),"utf-8");
out.println("用户名:"+name+"<BR>");
out.println("密码:"+word+"<BR>");
%>
其实都是一样的,只不过前者是后者的缩写,这样都不会出现中文乱码问题。
注:如果把result.jsp的核心代码改成下面的话,又会出现中文乱码:
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
String name=new String(username.getBytes("ISO-8859-1"),"GB2312");
String word=new String(password.getBytes("ISO-8859-1"),"GB2312");
out.println("用户名:"+name+"<BR>");
out.println("密码:"+word+"<BR>");
%>
所以大家最好字符编码设置为utf-8。
4.接下来说一下还有一种出现中文乱码的问题,就是你在创建jsp页面时添加并修改一些代码,即在jsp的前两行变成这样的代码:
如我在MyJsp1.jsp和result.jsp中都把前两行改成这样:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page contentType="text/html; charset=GB2312"%>
显然没有语法错误,看起来应该是可以的,但是一运行MyJsp1.jsp页面发现:
以上页面出现了中文乱码问题。
接下来我在那个用户名文本行里输入一个中文,再输入密码,点击注册按钮看提交到result.jsp里是否也会出现中文乱码问题:
点击之后的页面如下:
既然没问题,知道什么原因么,因为我们重新输入用户文本行的一个中文林业,在result.jsp里面获取文本行的内容并设置了字符编码为utf-8,所以不会出现乱码,但是不用我们获取的文本内容不会出现乱码,但是我们没改变表单内文本行里的内容,出现的就是????乱码了,即:
点击红色箭头之后跳转到result.jsp页面:
注:所以再创建JSP页面时不要后面那句<%@ page contentType="text/html; charset=GB2312"%>,只要<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>即可。
5.总结下,遇到中文乱码问题时,最好把字符编码规则设置为utf-8,因为这是国际通用的编码方式,但是为什么中国通用的编码方式GB2312就不能解决乱码问题呢,虽然我在MyEclipse下试验的结果是设置GB2312的会出现中文乱码问题,但是有些计算机使用GB2312不会出现乱码问题,这个真的很奇怪,有可能是服务器等等其它的原因,在这里,建议大家使用utf-8的编码方式,如果设置成这样都有错误,那试一下GB2312的编码方式,也有可能会解决,就这样了。
6.以上内容是我学习得来的,仅供学习参考所用,如有错误,请评论,写得不好,请见谅,谢谢!