HTTP协议规定浏览器向web服务器传递的参数信息中不能出现某些特殊字符,而必须对这些字符进行URL编码后再传递。Web服务器受到参数后,首先从中分离出每个参数的名称和值部分,再进行URL解码,解码得到字节数组,然后按照某种字符集转换成Unicode码
浏览器对form表单中输入的中文字符都会进行URL编码,再传送给web服务器。浏览器会按照当前显示页面时所采用的字符集编码来进行URL编码。
5点说明:
1.对于HTTP请求消息的请求行中的URL地址后的参数(get方法提交表单),getParameter等方法进行URL解码时所采用的字符集编码在Servelt规范中没有明确规定,它由各个Servlet引擎厂商自行决定。对于这种情况,Tomcat中的ServletRequest对象的getParameter等方法默认采用ISO8859-1进行解码
2.对于post方式下的"application/x-www-form-urlencoded"编码格式的实体内容,getParameter等方法以ServletRequest对象的getCharacterEncoding()方法返回的字符集对其进行URL解码。如果getCharacterEncoding()方法返回null,则采用ISO8859-1
3.ServletRequest接口中定义了一个setCharacterEncoding方法来设置请求消息中的实体内容的字符集编码名称,getParameter方法以该方法设置的字符集编码对实体内容进行URL解码。setCharacterEncoding方法来设置的字符集只影响getParameter方法对POST过来的内容进行URL解码的结果,而不能影响URL地址后的参数进行URL解码的结果
4.在Tomcat配置中,连接器(HTTP Connector)属性中有一个URIEncoding和useBodyEncodingForURI属性,这两个属性设置对URL后的附加参数进行URL解码时该如何选择字符集编码。URIEncoding用于制定URL后的附加参数的字符集编码,useBodyEncodingForURI则说明是否采用实体内容的字符集编码设置来替代URIEncoding的设置,也就是说当useBodyEncodingForURI属性设置为true时,ServletRequest.setCharacterEncoding方法设置的字符集编码也影响getParameter等方法对URL地址后的参数进行URL解码的结果。(在/%TomCat_Home%/conf/server.xml文件中找到 <Connector>标记,然后在后面加上useBodyEncodingForURI=true)
5.不同厂商的Servlet引擎内部进行URL解码的处理方式可能不一样,所以URL后面的中文参数最好还是进行URL编码。可以采用java.net.URLEncoder.encode()方法进行编码,然后浏览器中所显示出来的就是一堆百分号之类的字符