답변:
전체 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();
Uri.encode(query);
대신에.
여기에 하나의 제안을 추가하겠습니다. 외부 라이브러리를 얻지 않아도되도록 할 수 있습니다.
이것을 시도하십시오 :
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 문자열을 가져 와서 특별한 지식 없이도 작동시킬 수 있다는 것입니다.
안드로이드의 경우 String android.net.Uri.encode (String s)를 사용합니다.
UTF-8 체계를 사용하여 주어진 문자열의 문자를 '%'이스케이프 된 옥텟으로 인코딩합니다. 문자 ( "AZ", "az"), 숫자 ( "0-9") 및 예약되지 않은 문자 ( "_- !. ~ '() *")는 그대로 둡니다. 다른 모든 문자를 인코딩합니다.
전의/
String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);
Uri.encode("a=1&b=1")
생산 a%3D1%26b%3D1
하지만 예상a=1&b=1
a=1&b=1
쿼리로 입력 하면 정확하게 쿼리하려고합니다.
또한 이것을 사용할 수 있습니다
private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);
가장 간단한 방법입니다
아래 방법을 사용할 수 있습니다
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();
}
두 번째는 첫 번째보다 낫습니다.