JSP页面出现的中文乱码显示问题

时间:2022-11-16 06:52:52

今天在JSP编码的时候中文出现了乱码,所以想深入搞懂,就开始在网上和书本查资料,稍微整理了下,以便以后再次遇到可以查看,有些东西还是记下来比较好。

先看一下JSP的编码过程:

1.客户端首先发送请求给web容器
2.web容器将JSP首先转译成servlet源代码
3.web容器将servlet源代码编译成.class 文件
4.web容器执行.class 文件
5.web容器将结果响应给客户端

在JSP文件中第一行代码为

 <%@ page language="java" contentType="text/html; charset=iso-8859-1" pageEncoding="iso-8859-1"%>

其中首先区分下charset和pageEncoding的区别:

pageEncoding 是本JSP文件的保存编码方式,就是在本JSP页面编码最后存储的时候会根据pageEncoding的编码方式来存储,如果在本JSP编码中出现了中文,那么在存储的时候如果还是使用ISO-8859-1的编码方式就会提示错误。需要使用支持中文的GBK或者utf-8编码方式。

charset 是指服务器发送给客户端时的内容编码,也就是浏览器在得到此文件时以什么方式解码。如果文件中有中文,那么就需要指定为中文编码,不指定则浏览器在解码的时候不能正常对中文解码就出现乱码现象。

如果pageEncoding 不指定,则会根据charset 来决定文件的存储编码,如果两个都不指定,则会默认使用ISO-8859-1,即不支持中文。

需要注意的是我们的浏览器默认使用编码是utf-8。所以如果使用charset 为GBK则浏览器访问的时候还是乱码。

JSP的编码流程为,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat返回来的网页,用的是charset。


form表单提交中文显示乱码

在JSP页面中使用表单提交中文,在接收页面中文乱码显示,如一个表单页面和一个接收页面

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<html>
<head>
</head>
<body>
     <form method="post" action="test3.jsp" name="zhongwen">
        <div align="center">
                  姓名<input type="text" name="username"/>
                 <input type="submit" value="提交"/>
        </div>
     </form>
</body>
</html>

在接收页面

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%
String username = request.getParameter("username");
%>
<html>
<head>
</head>
<body>
<%=username %>
</body>
</html>

此时在form表单中输入中文提交则会在接受页面出现乱码

解决方法一:

可以在接收页面接受参数前设置request编码,只要把request设置成浏览器使用编码即可

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%
request.setCharacterEncoding("utf-8");  // 设置request编码
String username = request.getParameter("username");
%>

解决方法二:

可以对接收到的参数重新编码,先把接收到的根据ISO9959-1进行编码成字节序列数组,然后再根据浏览器编码转换成utf-8编码字符串

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%
String username = request.getParameter("username");
username = new String(username.getBytes("ISO-8859-1"),"utf-8");
%>
<html>
<head>
</head>
<body>
<%=username %>
</body>
</html>

使用这种方法就必须每接收一个参数使用以下这种转码方法。

解决方法三:

由于方法二需要在每次从request获取参数后都需要使用一遍会比较烦,所以还有使用过滤器比较方便,原理就是在每次表单提交之后都需要经过这个过滤器,而在过滤器中则每次都设置request的编码,这样就不需要在JSP接收页面中设置了。

关于正文乱码的过滤器使用网上有很多,测试还是上面的test1.jsp和test2.jsp。

参考:http://blog.csdn.net/wkupaochuan/article/details/7461208

首先过滤器类创建和代码如下:

package com.filter;//包名

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class Filter_charset implements Filter{

protected String encoding = null; // 接收字符编码
public void destroy() {
// TODO Auto-generated method stub
this.encoding = null;
System.out.println("destroy ...");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
/*如果从web.xml中读取的编码格式不为空,则对request设置编码格式*/
if (this.encoding != null)
{
request.setCharacterEncoding(this.encoding);//设置编码格式
/*这里只是在控制台输出验证是否加载了过滤器,并从web.xml中读取到了正确的编码格式*/
System.out.println("doFilter ......" + this.encoding);//
}
/*继续执行程序*/
chain.doFilter(request, response);
}

/*初始化函数*/
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
/*从web.xml中读取编码格式*/
this.encoding = filterConfig.getInitParameter("encoding");
System.out.println("init ...");
}
}

接下来就是对web.xml的配置,主要就是在当前工程目录下的所有文件都需要经过该过滤器,从而不会出现乱码现象。配置如下:

 
<!--中文乱码处理过滤-->
<filter>
<filter-name>EncodingFilter</filter-name><!--过滤器名称,自己起-->
<filter-class>com.filter.Filter_charset</filter-class><!--过滤器类名称,包括包名一致、写全-->
<init-param><!--初始化参数-->
<param-name>encoding</param-name><!--参数名称-->
<param-value>utf-8</param-value><!--参数值-->
</init-param>
</filter>

<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!--“/*”表示项目下所有资源-->
</filter-mapping>

<!--中文乱码处理过滤-->


以上几种解决乱码问题的方法比较容易懂,记下来以后遇到可以看看。