Java开发中,我们经常会碰到乱码问题,以下是本人经常会碰到的乱码问题解决方法。
首先补充几个知识点:
一、如果***.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,不管eclipse的encoding是什么,
pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet;
二、<%@ page contentType="text/html;charset=iso8859-1"%>表示当浏览器得到此文件时以什么方式解码,例如某个jsp文件上这样写
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
因为存为UTF-8的文件被解码为iso8859-1,肯定会出现乱码问题,正确方式应该是
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
三、request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8。
response.setCharacterEncoding("UTF-8")可以把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。
四、表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");
来转换成你想要的UTF-8编码方式,但不建议这样做。
五、对于Web容器来说,如果你不设置,默认是ISO8859-1,String des = new String(s.getBytes("iso8859-1"),"UTF-8");都可以使用这个
六、
默认情况下,tomcat使用的的编码方式:iso8859-1
修改tomcat下的conf/server.xml文件
找到如下代码:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
这段代码规定了Tomcat监听HTTP请求的端口号等信息。
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
七、进行页面跳转时,目标页面出现乱码问题,可以用URLEncoder.encode(URLEncoder.encode(name, "utf-8"))设置编码格式,在目标页面需要这样解码:URLDecoder.decode(name, "utf-8");
至于为啥第一次要进行两次编码,因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParameter();方法的时候使用服务器指定的编码格式自动解码一次,所以前台编码一次后台解码一次而解码和编码的方式不用所以造成了乱码的出现
八、如果js中进行跳转传参有中文时,在js中也可以采用上面的对中文进行两次编码,***.jsp?data="+encodeURI(encodeURI(data)),
在获取data值时,可以String data=URLDecoder.decode(request.getParameter("data"),"utf-8");
九、写一个过滤器对编码格式进行控制:
package com.XXX.Filter;
import javax.servlet.http.HttpServlet;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
public class EncodingFilter extends HttpServlet implements Filter
{
private FilterConfig config = null;
private String targetEncoding = "GBK";
public void init(FilterConfig filterConfig)
{
this.config = filterConfig;
this.targetEncoding = config.getInitParameter("encoding");
}
public void destroy()
{
config = null;
targetEncoding = null;
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain)
{
ServletRequest request = (ServletRequest) servletRequest;
try
{
request.setCharacterEncoding(targetEncoding);
filterChain.doFilter(servletRequest, servletResponse);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
web.xml配置:
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.XXX.Filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
参考资料:
http://blog.csdn.net/softwave/article/details/3564991
http://www.blogjava.net/caizh2009/articles/309193.html