JavaでURLデコードを行う方法は?


323

Javaでは、これを変換したい:

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

これに:

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

これは私がこれまでに持っているものです:

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

しかし、それは正しく機能しません。これらは何をしている%3Aし、%2Fフォーマットと呼ばれ、どのように私はそれらを変換するのですか?


@Stephen ..なぜURLをUTF-8エンコードされた文字列にできないのですか?
クラッカープレイス

問題は、URLがUTF-8である可能性があるからといって、問題が実際にはUTF-8とは何の関係もないということです。質問を適切に編集しました。
Chris Jester-Young

(理論的には)可能性がありますが、例の文字列はUTF-8でエンコードされた文字列ではありません。これは、URLエンコードされたASCII文字列です。したがって、タイトルは誤解を招くものです。
スティーブンC

url文字列内のすべての文字がASCIIであることも注目に値します。これは、文字列がURLデコードされた後も当てはまります。 '%'%xxASCII文字で、xxが(16進数)より小さい場合はASCII文字を表し80ます。
スティーブンC

回答:


634

これは、UTF-8やASCIIなどの文字エンコーディングとは関係ありません。あなたが持っている文字列はURLエンコードされています。この種のエンコーディングは、文字エンコーディングとはまったく異なるものです。

このようなものを試してください:

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 CharsetはAPIの直接サポートを追加しました。つまり、UnsupportedEncodingExceptionをキャッチする必要はありません。

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

文字エンコーディング(UTF-8やASCIIなど)は、文字の生バイトへのマッピングを決定するものであることに注意してください。文字エンコーディングの入門として、この記事を参照してください


1
のメソッドURLDecoderは静的であるため、その新しいインスタンスを作成する必要はありません。
11

2
@Trismegistos文字エンコーディング(2番目のパラメーター"UTF-8")を指定しないバージョンのみが、Java 7 APIドキュメントに従って非推奨になりました。2つのパラメーターを持つバージョンを使用します。
Jesper、

23
Java 1.7+を使用している場合はStandardCharsets.UTF_8.name()、このパッケージの「UTF-8」文字列の静的バージョンを使用できますjava.nio.charset.StandardCharsets。これに関連する:リンク
Shahar 2014

1
文字エンコードについては、これもすばらしい記事になりますbalusc.blogspot.in/2009/05/unicode-how-to-get-characters-right.html
クラッカー14

4
これに注意してください。ここで述べたように:blog.lunatech.com/2009/02/03/… これはURLに関するものではなく、HTMLフォームのエンコーディングに関するものです。
ミハル


47

これは、回答されている前に、(この質問は最初だったが!):

「これを行うには、java.net.URIを使用する必要があります。URLDecoderクラスがx-www-form-urlencodedのデコードを実行するためです(名前にかかわらず、フォームデータ用です)。」

URLクラスのドキュメントの状態:

URLのエンコードとデコードを管理するための推奨される方法は、URIを使用し、toURI()URI.toURL()を使用してこれら2つのクラス間で変換することです。

URLEncoderおよびURLDecoderのクラスものみで定義された符号化方式と同じではないHTMLフォーム符号化のため、使用することができるRFC2396

基本的に:

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

あなたに与えるでしょう:

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

6
Java 1.7では、URLDecoder.decode(String, String)オーバーロードは非推奨ではありません。URLDecoder.decode(String)エンコーディングなしでオーバーロードを参照している必要があります。明確にするために、投稿を更新することをお勧めします。
アーロン

2
この答えは誤解を招くものです。このブロックの引用は、廃止予定とは関係ありません。廃止されたメソッドのJavadocは述べており、私は実際に引用しています@deprecated The resulting string may vary depending on the platform's default encoding. Instead, use the decode(String,String) method to specify the encoding.
Emerson Farrugia 2015

1
URIのgetPath()は、上記のように、URIのパス部分のみを返します。
Pelpotronic

2
私が間違っていない限り、「パス」は、オーソリティ部分の後のURIのその部分であることがわかっています(パスの定義については、en.wikipedia.org / wiki / Uniform_Resource_Identifierを参照)-私が見ている動作のようです標準/正しい動作です。私はJava 1.8.0_101(Android Studio)を使用しています。「getAuthority()」が呼び出されたときに何が得られるかを知りたいと思います。この記事/例でも、パスはURIの/ public / manual / appliancesの一部にすぎないことを示しているようです。quepublishing.com
articles

1
@Pelpotronic投稿のコードは、実際にはそれが示す出力を印刷します(少なくとも私にとって)。この理由は、URLエンコードのために、URIコンストラクターが実際にはストリング全体(https%3A%2F...)をURIのパスとして処理しているためだと思います。権限やクエリなどはありません。これは、URIオブジェクトでそれぞれのgetメソッドを呼び出すことによってテストできます。あなたはURIのコンストラクタにデコードされたテキストを渡す場合は、次のnew URI("https://mywebsite/do.....")、その後の呼び出しgetPath()や他の方法は、正しい結果が得られます。
Kröw

14

%3Aそして%2FURLエンコードされた文字です。このJavaコードを使用して、それらをに変換し:/

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

2
%2Cも変換しない、それは(、)です
vuhung3990 '06 / 01/15

これはtry / catchブロックでラップする必要があります。チェックされた例外(これ)とチェックされていないstackoverflow.com/questions/6115896/…の
Bruno Wolff

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

5
public String decodeString(String URL)
    {

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

        }

        return urlString;

    }

4
提供するソリューションについてもう少し説明を追加して、回答を詳しく説明していただけませんか?
abarisone 2015年


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

    } 

}

あなたは賢くあなたの方法を選ぶことができます:)


0

java.net.URIクラスを使用:

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

例外処理の方が優れている可能性がありますが、この例にはあまり関係がないことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.