Java實現的URL編碼和解碼技術
當編寫 “ 網絡爬蟲” 或下載器時,在 Java 中實現 URL 編碼和解碼是一個很常見的要求。本文的重點是創建用于對所傳遞的 URL 進行編碼和解碼的模塊。
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();
}
}
}
來自:http://developer.51cto.com/art/201704/536354.htm
本文由用戶 laolang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!