首先应该明白jsp页面两个与编码有关的参数的作用:
1、pageEncoding:用于指定jsp页面的编码格式,
pageEncoding指定文件保存的格式,由于JVM内部是使用的unicode编码格式,容器在编译JSP时
会根据pageEncoding指定的编码格式将文件内容转换为unicode的格式,
如果没有指定pageEncoding就默认使用charset的编码格式
2、contentType="text/html;charset=UTF-8"
charset的作用有两个,一是从服务器返回到浏览器时,指示浏览器以charset指定的编码格式显示内容,
另一个作用是,当我们在页面上填写完数据提交时,浏览器会将数据转换为charset指定的格式传给服务器。
charset默认的编码格式为ISO-8859-1
post方式传递参数
post方式的数据是通过Http请求头传给Servlet的,Servet容器在获取这些数据时,如通过getParameter()方法获取数据,容器会根据request.getCharacterEncoding()指定的编码格式来解析接收数据,
如果getCharacterEncoding()==null(默认情况正式如此,http协议没有传递编码信息给服务器)一般就默认使用ISO-8859-1。
如果我们在页面指定的charset编码不是ISO-8859-1也没有通过setetCharacterEncoding()指定编码格式,那么乱码问题就会产生了。
比如你在页面上面设定charset=UTF-8,现在有一个参数是三个汉字,那么UTF-8的编码就会有六个字节的数据,
此时容器用ISO-8859-1来解析数据,而ISO-8859-1是单字节的编码,
本来是两个字,容器却解析为六个,乱码问题由此就产生了。
解决这类乱码的方法是通过配置一个编码过滤器来指定编码格式:
public class EncodingFilter implements Filter {
public EncodingFilter() {
}
public void init(FilterConfig parm1) throws javax.servlet.ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws java.io.IOException,
javax.servlet.ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void destroy() {
}
}
url或者get方式传递参数
首先应该尽量避免使用这种方式传递中文参数,如果需要传递中文参数比较可靠的做法
在传递参数时使用URLEncoder.encode()对传递的参数进行编码,然后在参数使用端使用URLDecoder.decode()进行解码