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로 인코딩 된 문자열이 될 수 없습니까?
crackerplace

문제는 URL이 UTF-8 일 수 있기 때문에 질문은 실제로 UTF-8과 관련없다는 것입니다. 질문을 적절하게 편집했습니다.
Chris Jester-Young 12

이론 상으로는 가능하지만 예제의 문자열은 UTF-8로 인코딩 된 문자열이 아닙니다. URL로 인코딩 된 ASCII 문자열입니다. 따라서 제목이 잘못되었습니다.
Stephen C

url문자열의 모든 문자 가 ASCII 라는 것도 주목할 가치가 있으며, 이는 문자열이 URL 디코딩 된 후에도 마찬가지입니다. '%'ASCII 문자이며 (16 진수)보다 작은 %xx경우 ASCII 문자를 나타냅니다 . xx80
Stephen 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는 정적이므로 새 인스턴스를 만들 필요가 없습니다.
laz

2
@Trismegistos 문자 인코딩 (두 번째 매개 변수 "UTF-8")을 지정하지 않은 버전 만 Java 7 API 설명서에 따라 사용되지 않습니다. 두 개의 매개 변수가있는 버전을 사용하십시오.
Jesper

23
Java 1.7 이상을 사용하는 StandardCharsets.UTF_8.name()경우이 패키지에서 "UTF-8"문자열의 정적 버전을 사용할 수 있습니다 java.nio.charset.StandardCharsets. 이와 관련하여 : link
Shahar

1
문자 인코딩의 경우 훌륭한 기사가 너무 balusc.blogspot.in/2009/05/unicode-how-to-get-characters-right.html
crackerplace

4
이것을 조심하십시오. 여기에 언급 된대로 : blog.lunatech.com/2009/02/03/… URL에 관한 것이 아니라 HTML 양식 인코딩에 관한 것입니다.
Michal


47

이것은 이전 에 답변되었습니다 (이 질문은 처음이지만!) :

"URLDecoder 클래스가 잘못된 x-www-form-urlencoded 디코딩을 수행하기 때문에 java.net.URI를 사용해야합니다 (이름에도 불구하고 양식 데이터 용임)."

URL 클래스의 문서 상태 :

URL 인코딩 및 디코딩을 관리하는 데 권장되는 방법은 URI 를 사용 하고 toURI ()URI.toURL () 을 사용 하여이 두 클래스 간을 변환하는 입니다.

URLEncoderURLDecoder 클래스도 만에 정의 된 인코딩 방식과 동일하지 않습니다 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)인코딩없이 과부하를 참조해야합니다 . 설명을 위해 게시물을 업데이트 할 수 있습니다.
Aaron

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

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/article.aspx?p=26566&seqNum=3
Pelpotronic

1
@Pelpotronic 게시물의 코드는 실제로 (적어도 나에게) 표시되는 출력을 인쇄합니다. URL 인코딩으로 인해 URI 생성자가 실제로 전체 문자열 ( https%3A%2F...)을 URI의 경로로 취급하기 때문입니다. 권한이나 쿼리 등이 없습니다. 이것은 URI 객체에서 각각의 get 메소드를 호출하여 테스트 할 수 있습니다. 디코딩 된 텍스트를 URI 생성자 :에 전달하면 new URI("https://mywebsite/do.....")호출 getPath()및 기타 메소드가 올바른 결과를 제공합니다.
Kröw

14

%3A%2FURL 인코딩 된 문자입니다. 로 다시 변환이 자바 코드를 사용 :하고/

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

2
그것은 너무 그것의 () %의 2C 변환하지
vuhung3990

이것은 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 2016 년


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.