首先得知道关于设置编码各个属性的含义:
1、pageEncoding=”UTF-8”的作用是设置JSP编译成Servlet时使用的编码。
2、contentType=”text/html;charset=UTF-8”的作用是指定对服务器响应进行重新编码的编码。
3、request.setCharacterEncoding(“UTF-8”)的作用是设置对客户端请求进行重新编码的编码。
4、response.setCharacterEncoding(“UTF-8”)的作用是指定对服务器响应进行重新编码的编码。
response.setCharacterEncoding(“UTF-8”)的作用是指定对服务器响应进行重新编码的编码。同时,浏览器也是根据这个参数来对其接收到的数据进行重新编码(或者称为解码)。所以在无论你在JSP中设置response.setCharacterEncoding (“UTF-8”)或者response.setCharacterEncoding(“GBK”),浏览器均能正确显示中文(前提是你发送到浏览器的数据编码是正确的,比如正确设置了pageEncoding参数等)。
对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。
对于get方式提交的数据:
提交页面在传输数据时,数据直接在url上进行拼接,使用&分隔key-value对,但有时key,value会出现中文等对于html标准来说不安全的字符,所以首先会用utf-8编码,把每个字节变成%xy的形式,然后数据传输到服务器时,会根据服务器设置的URIEncoding属性再编码一次,如果没有设置则默认以iso-8859-1来进行编码
所以这样到达服务器时,传输的数据经过了两次编码,当从接收页面再获取这数据时,也应该经过两次解码,才能正确的获取参数,
第一次是对二进制内容的iso-8859-1的解码,第二次是使用服务器设置的编码对数据进行解码
比如有以下几种情况:
(1)、服务器没有设置URIEncoding属性,那么数据到达服务器时,就经过了UTF-8编码和iso-8859-1编码,所以接收页面也得经过两次解码:
new String(request.getParameter(“paramName”).getBytes(“ISO-8859-1”),”UTF-8”);
(2)、服务器设置URIEncoding=”GBK”,那么数据到达服务器时,就经过了UTF-8编码和GBK编码,所以接收页面也得经过两次解码:
new String(request.getParameter(“paramName”).getBytes(“GBK”),”UTF-8”);
(3)、服务器设置URIEncoding=”UTF-8”,那么数据到达服务器时,实际上数据已经解码了,这时候直接过去即可:
request.getParameter(“paramName”);
当然也可以这样写:new String(request.getParameter(“paramName”).getBytes(“UTF-8”),”UTF-8”);
对于post方式提交的数据:
对于表单中POST方式提交的数据,只要在接收数据的JSP中正确request.setCharacterEncoding参数,即将对客户端请求进行重新编码的编码设置成浏览器编码,就可以保证得到的参数编码正确。