AndroidでのURLエンコード


335

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

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

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

上記を実行すると、http://in urlAsStringがin に置き換えられ、URLを使用したときにが取得 さhttp%3A%2F%2Fれます。encodedURLjava.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 2010

5
その後、それは単に壊れたURLです。アイデアは、クエリ部分がURLを壊さないようにすることです。
yanchenko 2010

5
@hgpc-RFC3986のセクション3(tools.ietf.org/html/rfc3986#section-3)をご覧ください。URIのさまざまな部分をエンコードする方法を説明します。残念ながら、URIの各部分(ホスト、パス、クエリなど)のエンコーディングルールは少し異なります。
D.Shawley 2010

2
これは、URLの特定の部分を処理しているだけで問題なく、URLを構築または再構築する方法を知っています。任意のURL文字列を処理できるより一般的なアプローチについては、以下の私の回答を参照してください。
クレイグB

8
これを使用すると非推奨の警告が表示されるのはなぜですか?Uri.encode(query);代わりに使用されます。
prasanthv 2014

166

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

このアプローチの優れた点は、有効なURL文字列を取得して、特別な知識を必要とせずに機能させることができることです。


19
これが正解です。これが正式で明確な方法です
Asanka Senavirathna 2012

3
URLコンストラクターに送信する前にurlStrをurldecodeすることもお勧めします。URLDecoder.decode(urlStr)
Jakob Eriksson

1
投稿ありがとうございます:)しかし、私は問題に直面しています。URLがすでに部分的にエンコードされている場合は、すでにエンコードされている部分をエンコードしています。私は何をすべきか?例:dj-videos.us/Music/XclusiveSinGleTrack/320%20Kbps/…%20は%2520にコード化されます
ベルセルク

2
@berserkすでにエンコードされている場合は、エンコードしないでください。部分的にエンコードされている状態にならないようにしてください。または、エンコードされているかどうかがわかりません。
ローンの侯爵2014年

3
このメソッドは、ğから%C4%9Fまでの文字をエンコードしません。受け入れられたものはエンコードします!
Alexander Prokofyev、2015年

74

アンドロイドの場合、文字列を使用します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 2015

14
@loentarこれは期待される結果です。ユーザーa=1&b=1がクエリとして入力した場合は、それを正確にクエリする必要があります。
Anubian Noob 2015

これはURLEncoder.encode(StringHere、 "UTF-8")とどのように異なるか
stuckedoverflow

@stuckedoverflow 1つには、URLEncoder.encode(str、 "UTF-8")とは異なり、Uri.encode(str)がチェック例外をスローしない
deekshith

50

これも使えます

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

最も簡単な方法です


1
これは最善の解決策ではありませんが、間違いなく素早い解決策です...
Sebastian Breit 14年

4
これは、URL全体が信頼できない場合の最も速い修正です。ありがとう!
user1032613 14

%を許可しますか?エンコードしないでください。
MediumOne、2015年

1
このURLをエンコードして共有できるようにし、ユーザーがリンクを開いてページを表示できるようにする方法: yazd20.com//News/2015/11/استند-آب-كمدي-حسن-ريوندي-در-يزد。html
Ahmad Ebrahimi 2015年

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

2つ目は1つ目よりも優れています。


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.