查看: 484|回复: 0

[Java学习] Java实现的URL编码和解码技术

发表于 2017-6-13 12:00:03

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

Main 方法

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. 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";
  4. 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";
  5. String decodeURL = decode(url);
  6. System.out.println("Decoded URL: "+decodeURL);
  7. String encodeURL = encode(url2);
  8. System.out.println("Encoded URL2: "+encodeURL);
  9. }
复制代码

它是如何工作的?

url 是一个变量,保存着我们希望解码的已被编码的 URL url2 是保存着我们希望编码的 url 的变量 调用 decode 方法,该方法解码和打印 URL 调用 encode 方法,该方法编码和打印 url2

Encode 方法

  1. public static String encode(String url)
  2. {
  3. try {
  4. String encodeURL=URLEncoder.encode( url, "UTF-8" );
  5. return encodeURL;
  6. } catch (UnsupportedEncodingException e) {
  7. return "Issue while encoding" +e.getMessage();
  8. }
  9. }
复制代码

它是如何工作的

使用名为 URLEncoder 的预定义 Java 类的 encode 方法 URLEncoder 类的 encode 方法需要两个参数:

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

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

编码之后,将返回编码后的 URL 结果
  1. public static String decode(String url)
  2. {
  3. try {
  4. String prevURL="";
  5. String decodeURL=url;
  6. while(!prevURL.equals(decodeURL))
  7. {
  8. prevURL=decodeURL;
  9. decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );
  10. }
  11. return decodeURL;
  12. } catch (UnsupportedEncodingException e) {
  13. return "Issue while decoding" +e.getMessage();
  14. }
  15. }
复制代码

Decode 方法

  1. public static String decode(String url){
  2. try {
  3. String prevURL="";
  4. String decodeURL=url;
  5. while(!prevURL.equals(decodeURL))
  6. {
  7. prevURL=decodeURL;
  8. decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );
  9. }
  10. return decodeURL;
  11. } catch (UnsupportedEncodingException e) {
  12. return "Issue while decoding" +e.getMessage();
  13. }
  14. }
复制代码

它是如何工作的

因为相同的 URL 可以被多次编码,所以我们需要一直对它进行解码直到不能再解码为止。举个例子,"video%252Fmp4" 是两次编码的结果。第一次解码后,我们得到 "video%2Fmp4"。要得到正确的结果 "video/mp4",我们需要再解码一次。 使用名为 URLEncoder 的预定义 Java 类的 decode 方法来解码 URLDecoder 类的 decode 方法需要两个参数:

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

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

解码后,返回已解码的 URL. 创建两个变量:prevURL 为空串,decodeURL 包含待解码的 URL
  1. Variable State:
  2. prevURL = ""
  3. decodeURL ="somethingvideo%252Fmp4"
复制代码
创建一个重复执行的步骤,直到 prevURL 与 decodeURL 的值相等 将 decodeURL 的值赋值给 prevURL,将传递的 URL 解码后的值赋给 decodeURL
  1. Variable State:
  2. prevURL = "somethingvideo%252Fmp4"
  3. decodeURL ="somethingvideo%2Fmp4"
复制代码
如你所见,prevURL 的值不等于 decodeURL 的值,我们再次执行
  1. Variable State:
  2. prevURL = "somethingvideo%2Fmp4"
  3. decodeURL ="somethingvideo/mp4"
复制代码
再一次
  1. Variable State:
  2. prevURL = "somethingvideo/mp4"
  3. decodeURL ="somethingvideo/mp4"
复制代码
现在,prevURL 的值等于 decodeURL 的值了,得到了正确的解码结果。

输出

  1. 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
  2. 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
复制代码

完整的程序

  1. package com.cooltrickshome; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class URLEncodeDecode {
  2. public static void main(String[] args) {
  3. // 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";
  4. 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";
  5. String decodeURL = decode(url);
  6. System.out.println("Decoded URL: "+decodeURL);
  7. String encodeURL = encode(url2);
  8. System.out.println("Encoded URL2: "+encodeURL);
  9. }
  10. public static String decode(String url)
  11. {
  12. try {
  13. String prevURL="";
  14. String decodeURL=url;
  15. while(!prevURL.equals(decodeURL))
  16. {
  17. prevURL=decodeURL;
  18. decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );
  19. }
  20. return decodeURL;
  21. } catch (UnsupportedEncodingException e) {
  22. return "Issue while decoding" +e.getMessage();
  23. }
  24. }
  25. public static String encode(String url)
  26. {
  27. try {
  28. String encodeURL=URLEncoder.encode( url, "UTF-8" );
  29. return encodeURL;
  30. } catch (UnsupportedEncodingException e) {
  31. return "Issue while encoding" +e.getMessage();
  32. }
  33. }
  34. }
复制代码

来自:http://developer.51cto.com/art/201704/536354.htm



回复

使用道具 举报