Android의 URL 인코딩


336

Android 에서 URL 을 어떻게 인코딩 합니까?

나는 이것이 다음과 같다고 생각했다.

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);

위의 작업을 수행하면 http://in urlAsString이 in 으로 바뀌고 URL을 사용할 때 http%3A%2F%2Fin encodedURL이 표시 java.net.MalformedURLException됩니다.

답변:


630

전체 URL을 인코딩하지 않고 "신뢰할 수없는 소스"에서 가져온 URL의 일부만 인코딩합니다.

String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;

또는 확인 된 예외를 발생시키지 않는 DroidParts의 Strings.urlEncode (String str) 를 사용할 수 있습니다 .

아니면 같은 것을 사용하십시오

String uri = Uri.parse("http://...")
                .buildUpon()
                .appendQueryParameter("key", "val")
                .build().toString();

1
전체 URL을 신뢰할 수 없으면 어떻게합니까? 프로토콜을 제외한 모든 것을 인코딩해야합니까? 나는 이것을하기위한 편리한 방법을 기대했다.
hpique

5
그런 다음 URL이 깨졌습니다. 아이디어는 쿼리 부분이 URL을 손상시키지 않도록하는 것입니다.
yanchenko

5
@hgpc-RFC3986의 섹션 3 ( tools.ietf.org/html/rfc3986#section-3 )을 살펴보십시오 . URI의 다양한 부분을 인코딩하는 방법을 알려줍니다. 불행히도 URI의 각 부분 (호스트, 경로, 쿼리 등)에는 약간 다른 인코딩 규칙이 있습니다.
D.Shawley

2
이것은 URL의 특정 부분을 다루고 있으며 URL을 구성하거나 재구성하는 방법을 알고 있으면 좋습니다. URL 문자열을 처리 할 수있는보다 일반적인 접근 방식은 아래 답변을 참조하십시오.
Craig B

8
이것을 사용하여 더 이상 사용 중단 경고가 표시되는 이유는 무엇입니까? 사용 Uri.encode(query);대신에.
prasanthv

166

여기에 하나의 제안을 추가하겠습니다. 외부 라이브러리를 얻지 않아도되도록 할 수 있습니다.

이것을 시도하십시오 :

String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();

이 특정 URL에서 요청에 사용할 수 있도록 공백을 인코딩해야한다는 것을 알 수 있습니다.

Android 클래스에서 사용할 수있는 몇 가지 기능을 활용합니다. 첫째, URL 클래스는 URL을 적절한 구성 요소로 나눌 수 있으므로 문자열 검색 / 바꾸기 작업을 수행 할 필요가 없습니다. 둘째,이 방법은 단일 문자열이 아닌 구성 요소를 통해 URI를 구성 할 때 구성 요소를 올바르게 이스케이프 처리하는 URI 클래스 기능을 활용합니다.

이 방법의 장점은 유효한 URL 문자열을 가져 와서 특별한 지식 없이도 작동시킬 수 있다는 것입니다.


19
이것이 정답이어야합니다. 이것은 공식적이고 명확한 방법입니다
Asanka Senavirathna

3
URL 생성자에게 urlStr을 보내기 전에 urlStr을 urldecode하는 것이 좋습니다. URLDecoder.decode (urlStr)
Jakob Eriksson

1
게시물 주셔서 감사합니다 :) 그러나 나는 문제에 직면하고 있습니다. URL이 이미 부분적으로 인코딩 된 경우 이미 인코딩 된 부분을 인코딩하는 것입니다. 어떻게해야합니까? 예를 들어 dj-videos.us/Music/XclusiveSinGleTrack/320%20Kbps/... 은 % 20 % 2520 부호화
광포

2
@berserk 이미 인코딩 된 경우 인코딩하지 마십시오. 부분적으로 인코딩 된 상태가 아니거나 인코딩 된 상태인지 확실하지 않은 상태가되어서는 안됩니다.
Lorne의 후작

3
이 방법은 ğ와 같은 문자를 % C4 % 9F로 인코딩하지 않습니다. 받아 들여진 하나!
Alexander Prokofyev 2016 년

74

안드로이드의 경우 String android.net.Uri.encode (String s)를 사용합니다.

UTF-8 체계를 사용하여 주어진 문자열의 문자를 '%'이스케이프 된 옥텟으로 인코딩합니다. 문자 ( "AZ", "az"), 숫자 ( "0-9") 및 예약되지 않은 문자 ( "_- !. ~ '() *")는 그대로 둡니다. 다른 모든 문자를 인코딩합니다.

전의/

String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);

2
불행히도 Uri.encode("a=1&b=1")생산 a%3D1%26b%3D1하지만 예상a=1&b=1
loentar

14
@loentar 예상되는 결과입니다. 사용자가 a=1&b=1쿼리로 입력 하면 정확하게 쿼리하려고합니다.
Anubian Noob

URLEncoder.encode (StringHere, "UTF-8")과 다른 점
stuckedoverflow

@stuckedoverflow 우선 Uri.encode (str)는 URLEncoder.encode (str, "UTF-8")과 달리 확인 된 예외를 throw하지 않습니다.
deekshith

50

또한 이것을 사용할 수 있습니다

private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);

가장 간단한 방법입니다


1
이것은 최고의 해결책은 아니지만 확실히 좋은 빠른 해결책입니다 ... 감사합니다
Sebastian Breit

4
전체 URL을 신뢰할 수없는 경우 가장 빠른 수정입니다. 감사!
user1032613

%가 허용되어야합니까? 인코딩되어서는 안됩니까?
MediumOne

1
이 URL을 인코딩하여 공유하고 링크를 열고 페이지를 볼 수있게하는 방법 : yazd20.com//News/2015/11/ استند-آب-كمدي-حسن-ريوندي-در-يزد. html
Ahmad Ebrahimi

3
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

1

아래 방법을 사용할 수 있습니다

public static String parseUrl(String surl) throws Exception
{
    URL u = new URL(surl);
    return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString();
}

또는

public String parseURL(String url, Map<String, String> params)
{
    Builder builder = Uri.parse(url).buildUpon();
    for (String key : params.keySet())
    {
        builder.appendQueryParameter(key, params.get(key));
    }
    return builder.build().toString();
}

두 번째는 첫 번째보다 낫습니다.


0

아랍어 문자를 찾아 UTF-8 인코딩으로 바꿉니다. 이 같은:

for (int i = 0; i < urlAsString.length(); i++) {
    if (urlAsString.charAt(i) > 255) {
        urlAsString = urlAsString.substring(0, i) + URLEncoder.encode(urlAsString.charAt(i)+"", "UTF-8") + urlAsString.substring(i+1);
    }
}
encodedURL = urlAsString;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.