请求参数编码处理学习笔记
程序员文章站
2022-06-02 19:06:19
...
POST请求参数编码处理
- 如果浏览器没有在Content-Type标头设置字符编码(eg: Content-Type: text/html;charset=UTF-8)
- 此时使用request.getCharacterEncoding()返回值为null
- 在这种情况下,容器若使用默认编码处理是ISO-8859-1,而浏览器使用UTF-8发送ASCII字符的请求参数。
- 相当于浏览器做了String text = URLEncoder.encode(“林”,“UtF-8”) ;
- 而Servlet取得参数,若容器默认使用ISO-8859-1编码,相当于String text = URLDecoder.decode("%E6%9E%97",“ISO-8859-1”) ; 而出现乱码。
- 可以使用request.setCharacterEncoding()指定获取POST参数时使用的编码。如果浏览器以UTF-8发送请求,设置request编码后,
相当于要求容器做了String text = URLDecoder.decode("%E6%9E%97",“UTF-8”) ;这样就能取得正确的“林”中文字符了。
GET请求参数编码处理
- request的setCharacterEncoding()无效,是因为处理URI的是HTTP服务器,而非WEB容器。
- 在tomcat 7或之前版本附带http服务器处理URI使用默认编码是ISO-8859-1,若浏览器使用UTF-8发送请求。
- Servlet中取得请求参数时相当于:String name = URLDecoder.decode("%E6%9E%97",“ISO-8859-1”) ;
- 按照String text = new String(name.getByte(“ISO-8859-1”),“UTF-8”) ;就能得到“林”了。
- 加深理解代码片段
@Slf4j public class ParameterEncodeDecodeTest { @Test public void get() throws UnsupportedEncodingException { // 1. 浏览器使用UTF-8获取字节数组编码后并发送过来内容 String info = "%E5%BC%A0%E4%B8%89" ; // 2. http服务器使用ISO-8859-1解码,并得到ISO-8859-1字符串 String decode = URLDecoder.decode(info, "ISO-8859-1"); log.info("====> {}", decode); // 地到ISO-8859-1字符串之前的UTF-8字节数组,并使用UTF-8转成字符串 String content = new String(decode.getBytes("ISO-8859-1"), "UTF-8") ; log.info("content : {}", content);//张三 } }
下一篇: 请求过去处理,(笔记)