1、get请求,参数是放在url中,而request.setCharactEncoding("UTF-8");是仅对消息体有效。
默认是ISO-8859-1编码,通过new String(paramValue.getBytes("ISO-8859-1"), "UTF-8")自己来转换。
上网查询通过修改Tomcat的server.xml配置文件中<Connector>节点,添加URLEncoding="UTF-8"),测试没成功,还在验证中。
修改server.xml文件<Connector>节点,添加URIEncoding="UTF-8",ok,完美解决问题,Tomcat上部署的所有web项目的编码都将修改。
不是URLEncoding
2、post请求是将参数放在消息体重,通过request.setCharactEncoding("UTF-8");可以解决问题。
如果需要通过out.println()方法输出内容,通过response.setCharacterEncoding("UTF-8")就可以。
2015-12-20晚新加
做项目过程中遇到Tomcat中设置了URIEncoding="UTF-8",测试妹子发现Chrome下是正常,IE传到后台的中文参数老是乱码。也没找到具体原因。使用get请求。
后来采用的解决办法是:对url或参数就行两次encodeURI(encodeURI(url)),后台做一次解码URLDecoder.decode(paramValue, "UTF-8");网上的解释是Tomcat会帮我们做一次解码,他解码采用的估计是iso-8859-1。简单总结为两次转码一次解码
Spring框架开发中配置的设置字符编码也仅对post请求有效。
<filter>
<filter-name>SetCharacterEncoding</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<async-supported>true</async-supported>
<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>
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
源代码org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(HttpServletRequest, HttpServletResponse, FilterChain)
其实也就是执行了request.setCharacterEncoding(this.encoding);
response.setCharacterEncoding(this.encoding);
这两句话也是仅对Post请求有效,就可以理解了。
2016-04-26加
个人测试发现,Tomcat中若不加入URIEncoding="UTF-8"
使用post请求和get请求都是乱码。
后来Connector节点加上 URIEncoding="UTF-8" ,post请求和get请求就都可以了。
遇到同样问题的可以加上和删掉测试一下。
虽然web.xml中配置了org.springframework.web.filter.CharacterEncodingFilter过滤器,post请求还是不能解决乱码问题。因此无奈只能加上
URIEncoding="UTF-8"。后续会换个电脑再继续验证...