问题描述:JSP页面的中文乱码问题产生的原因非常之多,下面给出解决思路和解决办法。
解决思路:JSP的流程是:页面->Servlet->数据库->Servlet->页面,所以一旦出现页面乱码,我们需要一步一步的判断。
1、首先是判断从页面到Servlet后乱码是否已经出现,怎么判断?很简单,在Servlet中获取页面参数后打印输出看一下。
2、如果Servlet中取到的参数没有出现乱码,而存入数据库后出现乱码,则说明数据库的编码格式不对。
3、如果数据里面是正确的中文,一般取出来就应该是正确的中文,这个时候如果返回页面乱码,则说明response中的设置有问题,也就是说返回页面的编码格式不对。
解决办法:
1、JSP->Servlet乱码
1.1 JSP页面部分
方法1:在JSP页面添加<_%@ page="" pageencoding="GB2312"><_!--_%@-->
作用:设置JSP文件自身的编码
方法2:在JSP页面添加<_%@ page="" contenttype="text/html; charset=GB2312"><_!--_%@-->
作用:设置JSP的输出流在浏览器中显示的编码
方法3:在JSP页面添加
作用:设置页面输入编码,即输入框输入的字体编码
方法4:在Eclipse中选择页面,右键选择Properties,在Text file encoding中选择GB2312
1.2 Servlet代码部分
方法1:request.setCharacterEncoding("GB2312");
作用:设置request对象的字符编码
方法2:针对每个获取到的参数进行转码
String newStr = new String(request.getParamter("pageParamName").getBytes("ISO-8859-1"));
或者
String newStr = new String(request.getParamter("pageParamName").getBytes("ISO-8859-1"),"GB2312");
作用:对每个参数转码
***************************************************************************************************
2、Servlet->DateBase乱码
方法1:安装MySql时设置好字符编码
方法2:如果MySql已经安装完成,可以在每次创建表时临时修改表的字符编码
首先使用命令SHOW VARIABLES LIKE 'character%';查看数据库的字符编码
然后使用命令SET character_set_client = GB2312 ;(其他的类似)逐一更改数据库的字符编码
最后创建重新创建表,注意数据库重启后字符编码设置失效
***************************************************************************************************
3、Servlet->JSP乱码
方法1:response.setContentType("text/html;charset=GB2312");
作用:设置out输出流中字符的编码方式以及浏览器接收到这些字符后以什么编码方式来解释
方法2:response.setCharacterEncoding("GB2312");
作用:设置out输出流中所采用的编码方式
方法3:编写一个字符编码过滤器filter
作用:为每个JSP页面自动设置编码方式
步骤:
> 编写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;
import javax.servlet.annotation.WebFilter;
public class EncodingFilter implements Filter {
public EncodingFilter() {
}
private String encoding = null;
public void init(FilterConfig fConfig) throws ServletException {
//从配置文件中获取encoding编码方式
encoding = fConfig.getServletContext().getInitParameter("encoding");
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
}
> 设置 web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MywebForMVC</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<filter>
<filter-name>Encoding</filter-name>
<filter-class>EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>