792

URLを持っているとしましょう

http://example.com/query?q=

次のようなユーザーが入力したクエリがあります。

ランダム単語 £500 銀行 $

結果を適切にエンコードされた URL にしたい:

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

これを達成するための最良の方法は何ですか?URI/URL オブジェクトを作成しようURLEncoderとしましたが、どれもうまくいきません。

4

11 に答える 11

1271

URLEncoder行く方法です。URL全体ではなく、個々のクエリ文字列パラメーターの名前や値のみをエンコードすることに注意してください。クエリ文字列パラメーターの区切り文字&やパラメーターの名前と値の区切り文字はエンコードしないでください=

String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);

まだ Java 10 以降を使用StandardCharsets.UTF_8.toString()していない場合は charset 引数として使用するか、まだ Java 7 以降を使用していない場合は を使用します"UTF-8"


クエリ パラメータ内のスペースは、正当に有効な+ではなくで表されることに注意してください。%20は通常、クエリ文字列 ( の後の部分) ではなく、%20URI 自体 (URI クエリ文字列の区切り文字 の前の部分) のスペースを表すために使用されます。??

encode()また、3 つの方法があることにも注意してください。1 つは 2 番目の引数として指定せずCharset、もう1 つStringはチェック例外をスローする 2 番目の引数として指定します。Charset引数のないものは非推奨です。絶対に使用せず、必ずCharset引数を指定してください。javadocでは、RFC3986およびW3Cで義務付けられているように、UTF-8 エンコーディングを使用することを明示的に推奨しています。

他のすべての文字は安全ではなく、最初に何らかのエンコード方式を使用して 1 つ以上のバイトに変換されます。次に、各バイトは 3 文字の文字列 "%xy" で表されます。ここで、xy はバイトの 2 桁の 16 進数表現です。推奨されるエンコード方式は UTF-8です。ただし、互換性の理由から、エンコーディングが指定されていない場合は、プラットフォームのデフォルトのエンコーディングが使用されます。

以下も参照してください。

于 2012-05-28T14:15:36.947 に答える
194

私は使用しませんURLEncoder。間違った名前 ( URLEncoderURL とは関係ありません) に加えて、非効率的です ( StringBufferBuilder の代わりに a を使用し、他のいくつかの遅いことを行います)。

代わりに、 SpringURIBuilderまたはCommons Apacheを使用します。その理由は、クエリ パラメータ名 (BalusC の answerなど) をパラメータ値とは異なる方法でエスケープする必要があるためです。org.springframework.web.util.UriUtils.encodeQueryHttpClientq

上記の唯一の欠点 (私が痛感しました) は、URL が URI の真のサブセットではないことです

サンプルコード:

import org.apache.http.client.utils.URIBuilder;

URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank \$");
String url = ub.toString();

// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24

他の回答にリンクしているだけなので、これをコミュニティ wiki としてマークしました。自由に編集してください。

于 2013-04-25T23:04:14.283 に答える
108

最初に次のような URI を作成する必要があります。

String urlStr = "http://www.example.com/CEREC® Materials & Accessories/IPS Empress® CAD.pdf"
URL url= new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());

次に、その Uri を ASCII 文字列に変換します。

urlStr=uri.toASCIIString();

これで、URL 文字列が完全にエンコードされました。最初に単純な URL エンコードを行い、次にそれを ASCII 文字列に変換して、US-ASCII 以外の文字が文字列に残っていないことを確認しました。これはまさにブラウザが行う方法です。

于 2014-09-09T00:52:06.503 に答える
35

Guava 15 では、単純な URL エスケープのセットが追加されました。

于 2013-12-04T13:18:07.093 に答える
7

Apache Http Components ライブラリは、クエリ パラメータを構築およびエンコードするための適切なオプションを提供します -

HttpComponents 4.x での使用 - URLEncodedUtils

HttpClient 3.x の場合 - EncodingUtil

于 2016-07-06T20:49:47.543 に答える
5

URL 文字列とパラメーターのマップを、クエリ パラメーターを含む有効なエンコード済み URL 文字列に変換するためにコードで使用できるメソッドを次に示します。

String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
    if (parameters == null) {
        return url;
    }

    for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {

        final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
        final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");

        if (!url.contains("?")) {
            url += "?" + encodedKey + "=" + encodedValue;
        } else {
            url += "&" + encodedKey + "=" + encodedValue;
        }
    }

    return url;
}
于 2016-11-01T06:47:25.447 に答える
5

Spring の UriComponentsBuilder を使用する:

UriComponentsBuilder
        .fromUriString(url)
        .build()
        .encode()
        .toUri()
于 2020-10-28T13:30:52.570 に答える
1

Android では、次のコードを使用します。

Uri myUI = Uri.parse ("http://example.com/query").buildUpon().appendQueryParameter("q","random word A3500 bank 24").build();

はどこUriですかandroid.net.Uri

于 2016-06-01T12:23:33.333 に答える