美文网首页架构设计java开发
URLEncoder 为什么需要对客户端传过来的中文字符进行解码

URLEncoder 为什么需要对客户端传过来的中文字符进行解码

作者: 欢乐时光欢乐你我 | 来源:发表于2018-11-28 11:29 被阅读5次

    URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换。

    在介绍 application/x-www-form-urlencoded MIME 字符串之前,我们先考虑如下场景,如下所示:

    http://mall.yaoex.com/product/toSearchPage?product2ndLM=%25E4%25B8%25AD%25E8%258D%25AF&product2ndLMCode=ZHONGYAO&from=4

    product2ndLM 对应的参数 中药 本来是 中文的,但是 :
    在我们向客户端发起请求时,浏览器会根据请求URL生成相应的请求报文发送给服务器。在这个过程中,如果我们在浏览器中的地址栏中所输入的URL包含中文字符时,浏览器首先会将这些中文字符进行编码然后再发送给服务器。实际上,浏览器会将它们转换为 application/x-www-form-urlencoded MIME 字符串,如下所示:

    中药 -》 %25E4%25B8%25AD%25E8%258D%25AF

    更确切的,当URL地址里包含非西欧字符的字符串时,浏览器都会将这些非西欧字符串转换成application/x-www-form-urlencoded MIME 字符串。

    在开发过程中,我们可能涉及将普通字符串和这种特殊字符串的相关转换,这就需要使用 URLDecoder 和 URLEncoder类进行实现,其中:

    1. URLDecoder类包含一个decode(String s,String enc)静态方法,它可以将application/x-www-form-urlencoded MIME字符串转成普通字符串;

    2. URLEncoder类包含一个encode(String s,String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencoded MIME字符串。

            // 将application/x-www-form-urlencoded字符串转换成普通字符串
            // 其中的字符串直接从上图所示窗口复制过来,chrome 默认用 UTF-8 字符集进行编码,所以也应该用对应的字符集解码
            System.out.println("采用UTF-8字符集进行解码:");
            String keyWord = URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "UTF-8");
            System.out.println(keyWord);
            System.out.println("\n 采用GBK字符集进行解码:");
            System.out.println(URLDecoder.decode("%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6+Rico", "GBK"));
    
    
    
            采用UTF-8字符集进行解码:
            中药
    
            采用GBK字符集进行解码:
            乱码
    
    

    特别地,仅包含西欧字符的普通字符串和application/x-www-form-urlencoded MIME字符串无须转换,而包含中文字符的普通字符串则需要转换,转换的方法是每个中文字符占2个字节,每个字节可以转换成2个十六进制的数字,所以每个中文字符将转换成“%XX%XX”的形式。当然,采用不同的字符集时,每个中文字符对应的字节数并不完全相同,所以使用URLEncoder和URLDecoder进行转换时也需要指定字符集。特别地,字符串应以同样的字符集进行编码和解码,否则会产生意想不到的结果

            // 将普通字符串转换成application/x-www-form-urlencoded字符串
            System.out.println("\n 采用utf-8字符集:");
            String urlStr = URLEncoder.encode("天津大学", "utf-8");
            System.out.println(urlStr);
            System.out.println("\n 采用GBK字符集:");
            String urlStr2 = URLEncoder.encode("天津大学", "GBK");
            System.out.println(urlStr2);
    

    相关文章

      网友评论

        本文标题:URLEncoder 为什么需要对客户端传过来的中文字符进行解码

        本文链接:https://www.haomeiwen.com/subject/likaqqtx.html