欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

请求参数编码处理学习笔记

程序员文章站 2022-06-02 19:06:19
...

POST请求参数编码处理

  1. 如果浏览器没有在Content-Type标头设置字符编码(eg: Content-Type: text/html;charset=UTF-8)
  2. 此时使用request.getCharacterEncoding()返回值为null
  3. 在这种情况下,容器若使用默认编码处理是ISO-8859-1,而浏览器使用UTF-8发送ASCII字符的请求参数。
  4. 相当于浏览器做了String text = URLEncoder.encode(“林”,“UtF-8”) ;
  5. 而Servlet取得参数,若容器默认使用ISO-8859-1编码,相当于String text = URLDecoder.decode("%E6%9E%97",“ISO-8859-1”) ; 而出现乱码。
  6. 可以使用request.setCharacterEncoding()指定获取POST参数时使用的编码。如果浏览器以UTF-8发送请求,设置request编码后,
    相当于要求容器做了String text = URLDecoder.decode("%E6%9E%97",“UTF-8”) ;这样就能取得正确的“林”中文字符了。

GET请求参数编码处理

  1. request的setCharacterEncoding()无效,是因为处理URI的是HTTP服务器,而非WEB容器。
  2. 在tomcat 7或之前版本附带http服务器处理URI使用默认编码是ISO-8859-1,若浏览器使用UTF-8发送请求。
  3. Servlet中取得请求参数时相当于:String name = URLDecoder.decode("%E6%9E%97",“ISO-8859-1”) ;
  4. 按照String text = new String(name.getByte(“ISO-8859-1”),“UTF-8”) ;就能得到“林”了。
  5. 加深理解代码片段
    @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);//张三
        }
    }
    
相关标签: java