web-dev-qa-db-ja.com

文字列をURLに解析します

URLインスタンスを作成するために動的文字列値を解析するにはどうすればよいですか?スペースを%20、アクセント、非ASCII文字に置き換える必要があります...?

URLEncoderを使おうとしましたが、/文字もエンコードし、URLEncoderでエンコードされた文字列をURLコンストラクターに渡すと、MalformedURLException(プロトコルなし)を取得します。 )。

14
Arutha

URLEncoderには非常に誤解を招くという名前が付いています。 Javadocs MIMEタイプ_application/x-www-form-urlencoded_を使用して使用されるエンコードフォームパラメータに準拠しています。

これにより、たとえばクエリパラメータをエンコードするために使用できます。たとえば、パラメータが_&/?#_のように見える場合、そのエンコードされた同等物は次のように使用できます。

_String url = "http://Host.com/?key=" + URLEncoder.encode("&/?#");
_

これらの特別なニーズがない限り、 RL javadocsnew URI(..).toURL を使用することをお勧めします。これは RFC2396 に従ってURIエンコードを実行します。

URLのエンコードとデコードを管理するための推奨される方法は、URIを使用することです。

次のサンプル

_new URI("http", "Host.com", "/path/", "key=| ?/#ä", "fragment").toURL();
_

結果_http://Host.com/path/?key=%7C%20?/%23ä#fragment_を生成します。 _?&/_などの文字がエンコードされていないことに注意してください。

詳細については、投稿 JavaでのHTTP URLアドレスエンコード または Javaで特殊文字を回避するためにURLをエンコードする方法 を参照してください。


[〜#〜]編集[〜#〜]

入力は文字列URLであるため、URIのパラメーター化されたコンストラクターの1つを使用しても役に立ちません。 new URI(strUrl)はURLパラメータを引用しないため、直接使用することもできません。

したがって、この段階では、トリックを使用して必要なものを取得する必要があります。

_public URL parseUrl(String s) throws Exception {
     URL u = new URL(s);
     return new URI(
            u.getProtocol(), 
            u.getAuthority(), 
            u.getPath(),
            u.getQuery(), 
            u.getRef()).
            toURL();
}
_

このルーチンを使用する前に、文字列をサニタイズして、absoluteURLを表すようにする必要があります。これには2つのアプローチがあります。

  1. 推測。文字列がすでに存在しない限り、文字列の前に_http://_を付けます。

  2. new URL(URL context, String spec) を使用してコンテキストからURIを構築します

35
Johan Sjöberg

つまり、あなたが言っているのは、URLの全部ではなく、一部をエンコードしたいということです。それをパーツに分割し、エンコードしたいものをエンコーダーに渡し、それを再アセンブルしてURL全体を取得する必要があるように思えます。

3
stevevls