How to do URL decoding in Java?

JavaUrl Encoding

Java Problem Overview


In Java, I want to convert this:

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

To this:

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

This is what I have so far:

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){
		}
	}
}

But it doesn't work right. What are these %3A and %2F formats called and how do I convert them?

Java Solutions


Solution 1 - Java

This does not have anything to do with character encodings such as UTF-8 or ASCII. The string you have there is URL encoded. This kind of encoding is something entirely different than character encoding.

Try something like this:

try {
    String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
    // not going to happen - value came from JDK's own StandardCharsets
}

Java 10 added direct support for Charset to the API, meaning there's no need to catch UnsupportedEncodingException:

String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);

Note that a character encoding (such as UTF-8 or ASCII) is what determines the mapping of characters to raw bytes. For a good intro to character encodings, see this article.

Solution 2 - Java

The string you've got is in application/x-www-form-urlencoded encoding.

Use URLDecoder to convert it to Java String.

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

Solution 3 - Java

This has been answered before (although this question was first!):

> "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)."

As URL class documentation states: > The recommended way to manage the encoding and decoding of URLs is to > use URI, and to convert between these two classes using toURI() and > URI.toURL(). > > The URLEncoder and URLDecoder classes can also be used, but only for > HTML form encoding, which is not the same as the encoding scheme > defined in RFC2396.

Basically:

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

will give you:

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

Solution 4 - Java

%3A and %2F are URL encoded characters. Use this java code to convert them back into : and /

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

Solution 5 - Java

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

Solution 6 - Java

public String decodeString(String URL)
    {

	String urlString="";
    try {
        urlString = URLDecoder.decode(URL,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
           
        }

        return urlString;

    }

Solution 7 - Java

I use [apache commons][1]

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

The default charset is UTF-8 [1]: http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/net/URLCodec.html#decode(java.lang.String)

Solution 8 - Java

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

}

You can select your method wisely :)

Solution 9 - Java

If it is integer value, we have to catch NumberFormatException also.

try {
        Integer result = Integer.valueOf(URLDecoder.decode(urlNumber, "UTF-8"));
    } catch (NumberFormatException | UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Solution 10 - Java

Using java.net.URI class:

public String getDecodedURL(String encodedUrl) {
    try {
        URI uri = new URI(encodedUrl);
        return uri.getScheme() + ":" + uri.getSchemeSpecificPart();
    } catch (Exception e) {
        return "";
    }
}

Please note that exception handling can be better, but it's not much relevant for this example.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncrackerplaceView Question on Stackoverflow
Solution 1 - JavaJesperView Answer on Stackoverflow
Solution 2 - JavaAlexander PogrebnyakView Answer on Stackoverflow
Solution 3 - JavaNick GrealyView Answer on Stackoverflow
Solution 4 - JavalazView Answer on Stackoverflow
Solution 5 - JavaHsmView Answer on Stackoverflow
Solution 6 - JavaRonak PoriyaView Answer on Stackoverflow
Solution 7 - JavaSorterView Answer on Stackoverflow
Solution 8 - JavarinuthomazView Answer on Stackoverflow
Solution 9 - JavaSelva RView Answer on Stackoverflow
Solution 10 - Javax7BiTView Answer on Stackoverflow