JavaのURLに行くためにクエリパラメータをどのようにエンコードしますか?私は知っている、これは明白ですでに質問されたように見える。
よくわからない2つの微妙な点があります。
ノート:
Java.net.URLEncoder.encode
は機能していないようです。データをエンコードしてフォームを送信するためのようです。たとえば、スペースを+
ではなく%20
としてエンコードし、必要のないコロンをエンコードします。Java.net.URI
はクエリパラメータをエンコードしませんJava.net.URLEncoder.encode(String s, String encoding)
も役立ちます。 application/x-www-form-urlencoded
をエンコードするHTMLフォームに従います。
URLEncoder.encode(query, "UTF-8");
一方、 パーセントエンコーディング ( RLエンコーディング とも呼ばれます)は、%20
でスペースをエンコードします。コロンは予約文字であるため、:
はエンコード後もコロンのままです。
編集:URIUtil
は、より新しいバージョンでは使用できなくなりました。 Java-encode URL またはこのスレッドのMr. Sindiによるより良い回答。
URIUtil
いくつかありますが、Apache httpclientが非常に便利です alternatives
URIUtil.encodeQuery(url);
たとえば、スペースを「%20」ではなく「+」としてエンコードします
両方とも 正しいコンテキストで完全に有効 です。ただし、本当に必要な場合は、文字列置換を発行できます。
残念ながら、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);
クエリでコロンを%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仕様 を参照してください。
ビルトインJava URLEncoderは想定されていることを実行しているため、使用する必要があります。
「+」または「%20」は、bothURLのスペース文字の有効な置換です。どちらでも機能します。
":"は区切り文字なので、エンコードする必要があります。すなわち http:// foo または ftp:// bar 特定のブラウザがエンコードされていないときにそれを処理できるという事実は、それを正しくしません。それらをエンコードする必要があります。
良い習慣の問題として、文字エンコーディングパラメータを取るメソッドを使用するようにしてください。通常、UTF-8が使用されますが、明示的に指定する必要があります。
URLEncoder.encode(yourUrl, "UTF-8");