Como fazer a decodificação de URL em Java?

Em Java, quero converter isso:

https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type 

Para isso:

 https://mywebsite/docs/english/site/mybook.do&request_type 

Isto é o que eu tenho até agora:

 class StringUTF { public static void main(String[] args) { try{ String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do" + "%3Frequest_type%3D%26type%3Dprivate"; System.out.println(url+"Hello World!------->" + new String(url.getBytes("UTF-8"),"ASCII")); } catch(Exception E){ } } } 

Mas isso não funciona bem. Quais são esses formatos %3A e %2F chamados e como convertê-los?

Isso não tem nada a ver com codificações de caracteres, como UTF-8 ou ASCII. A string que você tem lá é codificada por URL . Esse tipo de codificação é algo totalmente diferente da codificação de caracteres.

Tente algo assim:

 String result = java.net.URLDecoder.decode(url, "UTF-8"); 

Observe que uma codificação de caracteres (como UTF-8 ou ASCII) é o que determina o mapeamento de caracteres para bytes brutos. Para uma boa introdução às codificações de caracteres, consulte este artigo .

A string que você tem está na codificação application/x-www-form-urlencoded .

Use o URLDecoder para convertê-lo em Java String.

 URLDecoder.decode( url, "UTF-8" ); 

Isso foi respondido antes (embora essa questão tenha sido a primeira!):

“Você deve usar java.net.URI para fazer isso, já que a class URLDecoder faz a decodificação x-www-form-urlencoded, que está errada (apesar do nome, é para dados de formulário).”

Basicamente:

 String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type"; System.out.println(new java.net.URI(url).getPath()); 

Darei à você:

 https://mywebsite/docs/english/site/mybook.do?request_type 

%3A e %2F são caracteres codificados em URL. Use este código java para convertê-los de volta em : e /

 String decoded = java.net.URLDecoder.decode(url, "UTF-8"); 
  try { String result = URLDecoder.decode(urlString, "UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Eu uso o apache commons

 String decodedUrl = new URLCodec().decode(url); 

O conjunto de caracteres padrão é UTF-8

 public String decodeString(String URL) { String urlString=""; try { urlString = URLDecoder.decode(URL,"UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block } return urlString; } 
 import java.io.UnsupportedEncodingException; import java.net.URISyntaxException; public class URLDecoding { String decoded = ""; public String decodeMethod(String url) throws UnsupportedEncodingException { decoded = java.net.URLDecoder.decode(url, "UTF-8"); return decoded; //"You should use java.net.URI to do this, as the URLDecoder class does x-www-form-urlencoded decoding which is wrong (despite the name, it's for form data)." } public String getPathMethod(String url) throws URISyntaxException { decoded = new java.net.URI(url).getPath(); return decoded; } public static void main(String[] args) throws UnsupportedEncodingException, URISyntaxException { System.out.println(" Here is your Decoded url with decode method : "+ new URLDecoding().decodeMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type")); System.out.println("Here is your Decoded url with getPath method : "+ new URLDecoding().getPathMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest")); } } 

Você pode selecionar seu método com sabedoria 🙂

Apenas usar URLDecoder.decode uma vez não será suficiente.

Por exemplo :

Como o mesmo URL pode ser codificado várias vezes, precisamos decodificá-lo até que o URL não possa ser mais decodificado. Por exemplo, “video% 252Fmp4” é o resultado de duas codificações. Após decodificá-lo uma vez, obtemos “video% 2Fmp4”. Agora, o URL precisa ser decodificado para obtermos “video / mp4”, que é o resultado.

Aqui está o código que funciona para todos os casos:

 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(); } }