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


108

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

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

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

ノート:

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


2
クエリ部分の構造はサーバーに依存しますが、ほとんどはapplication/x-www-form-urlencodedキーと値のペアを想定しています。より多くのためにここを参照してください:illegalargumentexception.blogspot.com/2009/12/...
マクダウェル

回答:


127

java.net.URLEncoder.encode(String s, String encoding)も助けることができます。HTMLフォームのエンコーディングに従いますapplication/x-www-form-urlencoded

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

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


3
私はそれがURLエンコーディングを行うとは思わなかったと述べましたが、代わりにフォームを介して送信されるデータをエンコードします。コメント?
Alex Black

URLEncoderに適合しているapplication/x-www-form-urlencoded(有効なHTMLフォームのエンコーディングである)MIME形式。それはあなたが探しているものではないと思います。
ブハケシンディ2011

6
最終的にURLEncoder.encodeを使用し、「+」を「%20」に置き換えました
Alex Black

2
スラッシュを "%2F"にエンコードします。URLスラッシュをそのままにしないでください。
golimar 2013年

6
@golimarいいえ、必要ありません。URL全体ではなく、パラメータ値のみを指定することになっています。例を考えてみましょうhttp://example.com/?url=http://example.com/?q=c&sort=name。エンコードすべき&sort=nameかどうか。値とURLを区別する方法はありません。それが、そもそも値のエンコーディングが必要な理由です。
Pijusn 2014

15

編集:URIUtil最近のバージョンでは利用できなくなりました。Javaでより適切に回答してください-URLをエンコードするか、このスレッドでSindi氏が。


URIUtilいくつかの選択肢がありますが、Apache httpclientは本当に便利です

URIUtil.encodeQuery(url);

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

どちらも適切なコンテキストで完全に有効です。ただし、本当に希望する場合は、文字列置換を発行できます。


同意する必要があります。HttpClientを使用すると、はるかに幸せになります。
DaShaun、2011年

それは有望に見えます、偶然リンクを得ましたか?私はググってますが、たくさん見つけています。
アレックスブラック

1
このメソッドはHttpClient 4.1に存在しないようですか?hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/...
アレックス・ブラック

@Alex、うーん、うんざりする。私はいつもそのルーチンを使って、良い結果を出してきた。1つのアイデアは、3のリリースからソースコードを取得することです。彼らは、もはやそれを維持することを明らかに望んでいないからです。
JohanSjöberg、2011年

1
URIUtil.encodeWithinQuery個々のクエリパラメータをエンコードするために使用するものです。これは、元の質問が尋ねているようでした。
Jesse Glick 2014年

13

残念ながら、URLEncoder.encode()は(RFC 3986で指定されているように)有効なパーセントエンコーディングを生成しません。

URLEncoder.encode()は、スペースが「+」にエンコードされることを除いて、すべてをうまくエンコードします。私が見つけたすべての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);

+スペースの完全に有効なエンコーディングです。
Lawrence Dol

@LawrenceDol正しいですが、+正しく解釈されない場合があります-C#blogs.msdn.microsoft.com
yangxind/

この。JavascriptのencodeURIComponentメソッド出力に対してさまざまな選択肢を比較しましたが、これが私が試したもの(スペースを含むクエリ、トルコ語とドイツ語の特殊文字)と完全に一致する唯一のものでした。
UtkuÖzdemir2017

8

クエリでコロンを%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であることを疑っているので、パーセントでエンコードされたスペースのみが有効であるようにも見えます

目を向けるURI仕様の詳細について。


ただし、クエリ文字列の解釈はサーバー次第なので、URIの意味が変わる可能性があります。application/x-www-form-urlencodedクエリ文字列を作成する場合は、どちらでもかまいません。ユーザーが入力/貼り付けしたURLを修正する場合は、その:ままにしておく必要があります。
tc。

@tc。コロンが一般的な区切り文字として使用されている場合は、そのとおりです(RFCの12ページ)。ただし、それが一般的な区切り文字として使用されていない場合は、両方のエンコーディングが同じように解決されるはずです。
Edwin Buck

また、URLは実際にはURIのサブセットではないため、注意が必要です。adamgent.com
Adam Gent

5

組み込みのJava URLEncoderが想定どおりの動作をしているため、使用する必要があります。

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

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

良い習慣として、文字エンコーディングパラメータを取るメソッドを必ず使用してください。ここではUTF-8が一般的に使用されますが、明示的に指定する必要があります。

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

5
+はのスペースの表現にすぎませんapplication/x-www-form-urlencoded。HTTPに制限されている場合でも動作することは保証されていません。同様に、:有効なクエリ文字列にしてはいけませんに変換します%3B。サーバーはそれらを異なる方法で解釈することを選択できます。
tc。

1
この方法はまた、一部の例です全URLのスラッシュやその他の文字をエンコードhttp://http%3A%2F%2Fた正しくない
へKraの

2
@ToKra http://パートをエンコードすることは想定されていません。このメソッドは、クエリパラメータとエンコードされたフォームデータ用です。ただし、別のWebサイトのURLをクエリパラメーターとして渡す場合は、URLパーサーの混乱を避けるために、それをエンコードする必要があります。
beldaz

@tc私がw3.org/TR/html4/interact/forms.html#h-17.13.3.3を読むと、すべてのGETフォームデータがapplication/x-www-form-urlencodedコンテンツタイプとしてエンコードされます。つまり、HTTPで動作する必要があるということではありませんか?
beldaz

0

あなたがURLにスペースの問題しかない場合。以下のコードを使用しましたが、正常に動作します

String url;
URL myUrl = new URL(url.replace(" ","%20"));

例:URLは

www.xyz.com?para=hello sir

次に、muUrlの出力は

www.xyz.com?para=hello%20sir


0
String param="2019-07-18 19:29:37";
param="%27"+param.trim().replace(" ", "%20")+"%27";

日時(タイムスタンプ)URLEncoder.encode(param,"UTF-8")が機能しない場合に気付きました 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.