专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
程序猿  ·  开发者“疯狂”整活:用纯 C ... ·  1 周前  
OSC开源社区  ·  OSC源创会·西安站:【大模型技术与产业应用】 ·  3 天前  
码农翻身  ·  来了!GPT4o接入个人微信! ·  2 天前  
码农翻身  ·  Chrome背后最大的秘密:印度人拯救了Go ... ·  3 天前  
51好读  ›  专栏  ›  OSC开源社区

Java 实现的 URL 编码和解码技术

OSC开源社区  · 公众号  · 程序员  · 2017-04-05 08:26

正文

#点击图片报名参加武汉、长沙源创会#


OSC协作翻译

原文:URL Encoding and Decoding Using Java

链接:https://dzone.com/articles/url-encoding-and-decoding-using-java

翻译: BigEcho, Tocy, WangPerry, 无若, Tony


当编写 “ 网络爬虫” 或下载器时,在 Java 中实现 URL 编码和解码是一个很常见的要求。本文的重点是创建用于对所传递的 URL 进行编码和解码的模块。

源码:

https://github.com/csanuragjain/extra/tree/master/EncodeDecodeURL



Main 方法

public static void main(String[] args) {  

          // TODO Auto-generated method stub  

          String url="https%3A%2F%2Fr1---sn-ci5gup-cags.googlevideo.com%2Fvideoplayback%3Fpcm2cms%3Dyes%26mime%3Dvideo%252Fmp4%26pl%3D21%26itag%3D22%26\u0026itag=43\u0026type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22\u0026quality=medium";  

          String url2="https://r1---sn-ci5gup-cags.googlevideo.com/videoplayback?pcm2cms=yes&mime=video/mp4&pl=21&itag=22&&itag=43&type=video/webm; codecs=\"vp8.0, vorbis\"&quality=medium";  

          String decodeURL = decode(url);  

          System.out.println("Decoded URL: "+decodeURL);  

          String encodeURL = encode(url2);  

          System.out.println("Encoded URL2: "+encodeURL);  

     }


它是如何工作的?

● url 是一个变量,保存着我们希望解码的已被编码的 URL

● url2 是保存着我们希望编码的 url 的变量

● 调用 decode 方法,该方法解码和打印 URL

● 调用 encode 方法,该方法编码和打印 url2



Encode 方法

public static String encode(String url)  

{  

          try {  

               String encodeURL=URLEncoder.encode( url, "UTF-8" );  

               return encodeURL;  

          } catch (UnsupportedEncodingException e) {  

               return "Issue while encoding" +e.getMessage();  

          }  

}


它是如何工作的

● 使用名为 URLEncoder 的预定义 Java 类的 encode 方法

● URLEncoder 类的 encode 方法需要两个参数:

第一个参数定义的是待编码的 URL

第二个参数定义的是使用的编码方案

● 编码之后,将返回编码后的 URL 结果    

public static String decode(String url)  

{  

          try {  

               String prevURL="";  

               String decodeURL=url;  

               while(!prevURL.equals(decodeURL))  

               {  

                    prevURL=decodeURL;  

                    decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );  

               }  

               return decodeURL;  

          } catch (UnsupportedEncodingException e) {  

               return "Issue while decoding" +e.getMessage();  

          }  

}



Decode 方法

public static String decode(String url){
    try {
        String prevURL="";  
        String decodeURL=url;  
        while(!prevURL.equals(decodeURL))
        {
            prevURL=decodeURL;  
            decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );  
        }  
        return decodeURL;  
    } catch (UnsupportedEncodingException e) {
        return "Issue while decoding" +e.getMessage();  
    }  
}


它是如何工作的

● 因为相同的 URL 可以被多次编码,所以我们需要一直对它进行解码直到不能再解码为止。举个例子,"video%252Fmp4" 是两次编码的结果。第一次解码后,我们得到 "video%2Fmp4"。要得到正确的结果 "video/mp4",我们需要再解码一次。

● 使用名为 URLEncoder 的预定义 Java 类的 decode 方法来解码

● URLDecoder 类的 decode 方法需要两个参数:

第一个参数定义需要解码的 URL

第二个参数定义使用的解码方案

● 解码后,返回已解码的 URL.

● 创建两个变量:prevURL 为空串,decodeURL 包含待解码的 URL

Variable State:  

prevURL = ""  

decodeURL ="somethingvideo%252Fmp4"


● 创建一个重复执行的步骤,直到 prevURL 与 decodeURL 的值相等


● 将 decodeURL 的值赋值给 prevURL,将传递的 URL 解码后的值赋给 decodeURL

 Variable State:  

 prevURL = "somethingvideo%252Fmp4"  

 decodeURL ="somethingvideo%2Fmp4"


● 如你所见,prevURL 的值不等于 decodeURL 的值,我们再次执行

 Variable State:  

 prevURL = "somethingvideo%2Fmp4"  

 decodeURL ="somethingvideo/mp4"


● 再一次

 Variable State:  

 prevURL = "somethingvideo/mp4"  

 decodeURL ="somethingvideo/mp4"


● 现在,prevURL 的值等于 decodeURL 的值了,得到了正确的解码结果。



输出

Decoded URL: https://r1---sn-ci5gup-cags.googlevideo.com/videoplayback?pcm2cms=yes&mime=video/mp4&pl=21&itag=22&&itag=43&type=video/webm; codecs="vp8.0, vorbis"&quality=medium  

 Encoded URL2: https%3A%2F%2Fr1---sn-ci5gup-cags.googlevideo.com%2Fvideoplayback%3Fpcm2cms%3Dyes%26mime%3Dvideo%2Fmp4%26pl%3D21%26itag%3D22%26%26itag%3D43%26type%3Dvideo%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22%26quality%3Dmedium



完整的程序

package com.cooltrickshome;  import java.io.UnsupportedEncodingException;  import java.net.URLDecoder;  import java.net.URLEncoder;  public class URLEncodeDecode {  
     public static void main(String[] args) {  
          // TODO Auto-generated method stub            String url="https%3A%2F%2Fr1---sn-ci5gup-cags.googlevideo.com%2Fvideoplayback%3Fpcm2cms%3Dyes%26mime%3Dvideo%252Fmp4%26pl%3D21%26itag%3D22%26\u0026itag=43\u0026type=video%2Fwebm%3B+codecs%3D%22vp8.0%2C+vorbis%22\u0026quality=medium";  
          String url2="https://r1---sn-ci5gup-cags.googlevideo.com/videoplayback?pcm2cms=yes&mime=video/mp4&pl=21&itag=22&&itag=43&type=video/webm; codecs=\"vp8.0, vorbis\"&quality=medium";  
          String decodeURL = decode(url);  
          System.out.println("Decoded URL: "+decodeURL);  
          String encodeURL = encode(url2);  
          System.out.println("Encoded URL2: "+encodeURL);  
     }  
     public static String decode(String url)  
     {  
               try {  
                    String prevURL="";  
                    String decodeURL=url;  
                    while(!prevURL.equals(decodeURL))  
                    {  
                         prevURL=decodeURL;  
                         decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );  
                    }  
                    return decodeURL;  
               } catch (UnsupportedEncodingException e) {  
                    return "Issue while decoding" +e.getMessage();  
               }  
     }  
     public static String encode(String url)  
     {  
               try {  
                    String encodeURL=URLEncoder.encode( url, "UTF-8" );  
                    return encodeURL;  
               } catch (UnsupportedEncodingException e) {  
                    return "Issue while encoding" +e.getMessage();  
               }  
     }  
}




推荐阅读

4月15-16日武汉、长沙源创会火热报名中

年度大片:Stack Overflow 2017 开发者调查报告!

还在为测试发愁?10 个开源的压力/负载测试工具

花十分钟时间给 JFinal 写了个 talent-aio 插件

是时候让你们知道这些最好的开发者网站了!

点击“阅读原文”查看更多精彩内容