web-dev-qa-db-ja.com

AndroidでのURLコード

Androidで URL をどのようにエンコードしますか?

私はそれがこのようなものだと思った:

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

上記のようにすると、urlAsStringhttp://encodedURLhttp%3A%2F%2Fに置き換えられ、URLを使用するとJava.net.MalformedURLExceptionが返されます。

314
hpique

あなたはURL全体をエンコードするのではなく、「信頼できないソース」から来る部分だけをエンコードします。

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

代わりに、 Strings.urlEncode(String str) / DroidParts を使用することもできます。それはチェックされた例外を投げません。

またはのようなものを使う

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

ここに1つの提案を追加します。これを行うことで、外部ライブラリを入手する必要がなくなります。

これを試してみてください。

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クラスで利用可能ないくつかの機能を利用します。 1つ目は、URLクラスがURLを適切なコンポーネントに分割できるため、文字列の検索や置換作業を行う必要がないということです。次に、このアプローチでは、単一の文字列からではなくコンポーネントを介してURIを構築するときに、コンポーネントを適切にエスケープするというURIクラス機能を利用します。

この方法の利点は、有効なURL文字列を取得して、それを特別な知識を必要とせずに機能させることができることです。

163
Craig B

Androidの場合は、String Android.net.Uri.encode(String s)を使用します。

UTF-8スキームを使用して、指定された文字列内の文字を '%'でエスケープされたオクテットとしてエンコードします。文字( "A-Z"、 "a-z")、数字( "0-9")、および予約されていない文字( "_- !.〜 '()*")はそのまま残す他のすべての文字をエンコードします。

元/

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

これも使えます

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

それは最も簡単な方法です

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

あなたは以下の方法を使用することができます

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

2番目のものは最初のものより優れています。

1
Elango