http get方式的编码问题
比如一个笔者随手写的一个网址:http://www.baidu.com/君山?name=君山
它大致分为三部分:
- scheme协议:http
- uri:www.baidu.com/君山
- queryString请求参数:name=君山
后面两部分需要注意编码问题
对于uri来说,在网络传递过程中他的编码是不确定的,和浏览器的默认设置有关,通常是utf-8编码了。但是tomcat中对于uri默认的解码方式是通过iso-8859-1来解码,那么编码和解码不一致导致了乱码。我们可以通过设置server.xml中connector的URIEncoding属性为UTF-8来解决。这样tomcat就会默认用utf-8来解析uri了。
对于queryString请求参数来说,它的编码方式和http头部的ContentType有关,如果头部中没有ContentType,则采用发出请求网页的<meta charset="UTF-8">有关,这里为utf-8编码。tomcat中默认也会采用iso-8859-1来解码,会产生乱码。可以设置server.xml中的useBodyEncodingForURI属性为true,那么他会根据请求头部中的contentType指定的相应编码解码。或者通过request.setCharacterEncoding("UTF-8");设置对请求参数的解码。还有其他方法,如图:
http Header中Cookie、redirectPath 等编码
因为在tomcat中不能设置header中内容的解码方式,因此如果有非ascii码的字符肯定会乱码。因此非要在header中写入中文,比如在Cookie中写入中文字符,可以使用org.apache.catalina.util.URLEncoder将这些字符编码后再添加到Cookie中,读入的时候使用相应的函数来解码。
POST 表单的编解码
浏览器发送post表单时也是通过contenttype或者html中的<meta>元素来指定编码方式,在tomcat中也可以通过设置connector的useBodyEncodingForURI属性和在代码中设置request.setCharacterEncoding("UTF-8");等方法来解码。
参考: