web-dev-qa-db-ja.com

JavaのURLクエリパラメーターのエンコード

JavaのURLに行くためにクエリパラメータをどのようにエンコードしますか?私は知っている、これは明白ですでに質問されたように見える。

よくわからない2つの微妙な点があります。

  1. URLでスペースを「+」または「%20」としてエンコードする必要がありますか? chromeに「http://google.com/foo=?bar me」と入力するとchromeが%20でエンコードされるように変更します
  2. コロン ":"を%3Bとしてエンコードする必要がありますか? Chromeはサポートしていません。

ノート:

  • Java.net.URLEncoder.encodeは機能していないようです。データをエンコードしてフォームを送信するためのようです。たとえば、スペースを+ではなく%20としてエンコードし、必要のないコロンをエンコードします。
  • Java.net.URIはクエリパラメータをエンコードしません
95
Alex Black

Java.net.URLEncoder.encode(String s, String encoding) も役立ちます。 application/x-www-form-urlencodedをエンコードするHTMLフォームに従います。

URLEncoder.encode(query, "UTF-8");

一方、 パーセントエンコーディングRLエンコーディング とも呼ばれます)は、%20でスペースをエンコードします。コロンは予約文字であるため、:はエンコード後もコロンのままです。

116
Buhake Sindi

編集:URIUtilは、より新しいバージョンでは使用できなくなりました。 Java-encode URL またはこのスレッドのMr. Sindiによるより良い回答。


URIUtil いくつかありますが、Apache httpclientが非常に便利です alternatives

URIUtil.encodeQuery(url);

たとえば、スペースを「%20」ではなく「+」としてエンコードします

両方とも 正しいコンテキストで完全に有効 です。ただし、本当に必要な場合は、文字列置換を発行できます。

14
Johan Sjöberg

残念ながら、URLEncoder.encode()は、有効なパーセントエンコードを生成しません( http://tools.ietf.org/html/rfc3986#section-2.1 で指定されています)。

URLEncoder.encode()はすべてを正常にエンコードし、exceptスペースは「+」にエンコードされます。私が見つけたすべてのJava URIエンコーダーは、クエリ、フラグメント、パス部分などをエンコードするパブリックメソッドのみを公開しますが、「生」エンコードは公開しません。フラグメントとクエリはスペースを+にエンコードすることが許可されているため、これは残念です。したがって、それらを使用したくありません。パスは適切にエンコードされますが、最初に「正規化」されているため、「汎用」エンコードにも使用できません。

私が思いつくことができる最高のソリューション:

return URLEncoder.encode(raw, "UTF-8").replaceAll("\\+", "%20");

replaceAll()があなたにとって遅すぎる場合、代替案はあなた自身のエンコーダをロールすることだと思います...

編集:私は最初にここにこのコードを持っていましたが、これは「?」、「&」、「=」を正しくエンコードしません。

//don't use - doesn't properly encode "?", "&", "="
new URI(null, null, null, raw, null).toString().substring(1);
11
Kosta

クエリでコロンを%3Bとしてエンコードする必要はありませんが、そうすることは違法ではありません。

URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

また、スペースがALPHAまたはDIGITであるとは思わないため、パーセントでエンコードされたスペースのみが有効であるようです。

詳細については、 RI仕様 を参照してください。

8
Edwin Buck

ビルトインJava URLEncoderは想定されていることを実行しているため、使用する必要があります。

「+」または「%20」は、bothURLのスペース文字の有効な置換です。どちらでも機能します。

":"は区切り文字なので、エンコードする必要があります。すなわち http:// foo または ftp:// bar 特定のブラウザがエンコードされていないときにそれを処理できるという事実は、それを正しくしません。それらをエンコードする必要があります。

良い習慣の問題として、文字エンコーディングパラメータを取るメソッドを使用するようにしてください。通常、UTF-8が使用されますが、明示的に指定する必要があります。

URLEncoder.encode(yourUrl, "UTF-8");
5
rfeak