原因:tomcat默认的编码是:
iso-8859-1
当我们jsp页面编码是UTF-8时,针对中文参数,即使你在页面用java.net.URLEncoder.encode(param)进行了转码,后台用java.net.URLDecoder.decode(param)进行解码,获得的参数依旧是乱码,这就需要我们修改tomcat的默认编码了。
修改方法如下:
在TOMCAT中的server.xml中的
中添加两个设置
useBodyEncodingForURI="true" :设置POST和GET使用相同编码
URIEncoding="UTF-8" :对URI使用utf-8编码处理
结果如下:
useBodyEncodingForURI="true" URIEncoding="UTF-8"
connectionTimeout="20000" maxThreads="150"
port="8888" protocol="HTTP/1.1" redirectPort="8443"
/>
特殊情况:使用servlet的request.getParameter()获得参数(针对URL重写的情况)
因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParameter()方法的时候使用服务器指定的编码格式自动解码一次,所以前台编码一次后台解码一次而解码和编码的方式不一致,所以造成了乱码的出现。
这时也需要修改tomcat的默认编码为UTF-8,这样页面使用java.net.URLEncoder.encode(param)对中文进行转码,后台用request.getParameter()获得参数的时候,可以不用再次转码;
即时前台没有对中文进行编码,后台用request.getParameter()获得的参数依旧是正确的中文;
不过由于中文参数没有编码,在浏览器地址栏中显示的是参数是中文。
如下:
(1)页面使用java.net.URLEncoder.encode(param)对中文进行转码时
http://localhost:8080/CRUD/list.do?pageNum=3&totalNum=3&&name=%E5%A2%A8%E9%A6%99
(2)页面没有对中文进行转码时
http://localhost:8080/CRUD/list.do?pageNum=3&totalNum=3&&name=墨香
针对上面两种情况,在后台用request.getParameter()都可以获得正确的参数,而不用转码
注:我用form表单提交参数时,页面编码是UTF-8,没有修改tomcat的默认编码,获得的中文参数没有出现乱码,但是URL重写时,中文参数变成了乱码!!!