一、项目使用框架
解决方案:如果使用spring框架 则可以使用编码过滤器,配置如下
<!-- 字符编码过滤器 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
二、项目环境编码与jsp页面页面编码一致
右键项目-》Properties-》Resource 选择编码 比如选择的编码是UTF-8
那么jsp页面编码也必须是utf-8
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
三、servlet获取参数乱码
这里强调一点,在此使用的tomcat没有经过任何的修改与配置。
当页面通过两种方式请求Servlet的时候,参数的编码原本为UTF-8,在通过HTTP服务将请求发送出去的时候,会将参数重新按照ISO-8859-1编码后发送。因此,不管GET或POST方式,Servlet接收到的参数数据的编码均为ISO-8859-1,必须重新转码为UTF-8,才能正确显示中文参数。
1、GET方式的请求与接收过程
页面中参数“param=中文”的编码原本为GBK,当用GET方式发送参数的时候,参数值会被Web服务器从GBK转码为ISO-8859-1。
Servlet接收到的GET请求参数的编码当然为ISO-8859-1了,对于中文肯定显示不了,因此要将ISO-8859-1转换为GBK就可以正常显示中文了。
String param = request.getParameter("param");
String x = new String(param.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("GET方式获取的中文参数值:" + x);
String x = new String(param.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("GET方式获取的中文参数值:" + x);
2、POST方式请求与接收过程
页面中参数“param=中文”的编码原本为GBK,当点击页面中提交按钮后,参数会以UTF-8编码格式发送给Servlet,因此Servlet接收参数的时候必须将请求的编码明确设定为UTF-8,这样才能正确接收中文。
request.setCharacterEncoding("UTF-8");
String param = request.getParameter("param");
System.out.println("POST方式获取的中文参数值:" + param);
String param = request.getParameter("param");
System.out.println("POST方式获取的中文参数值:" + param);
或者,可以按照get方式来接收post的参数:
String param = request.getParameter("param");
String x = new String(param.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("GET方式获取的中文参数值:" + x);
String x = new String(param.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("GET方式获取的中文参数值:" + x);
疑问:为什么在GET方式下不设定请求的编码格式呢?原因是GET方式使用的编码为ISO-8859-1,用GBK、UTF-8等接收效果都是一样的(都是一堆字母和符号),编不编都一个样,如果指定ISO-8859-1编码是多一翻手续,如果指定了非ISO-8859-1编码,是脑子还不清醒,没搞明白这个原理,因此,GET方式就不要指定请求的编码了。
四、配置tomcat编码
修改tomcat conf文件夹下的server.xml 添加URIEncoding属性
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>