6

私の場合、「|」である賢明でない文字(RFC 2396)を含むパスを持つ URL オブジェクトを取得しました (パイプ) 文字。これを安全に URI に変換する必要がありますがURL.toURI()、例外がスローされます。

URL のドキュメントを読みましたが、この部分はわかりにくいです。

URL クラス自体は、RFC2396 で定義されているエスケープ メカニズムに従って URL コンポーネントをエンコードまたはデコードしません。URL を呼び出す前にエスケープする必要があるフィールドをエンコードすること、および URL から返されるエスケープされたフィールドをデコードすることは、呼び出し元の責任です。さらに、URL には URL エスケープの知識がないため、同じ URL のエンコードまたはデコードされた形式の間の同等性を認識しません。

では、どうすればいいですか?変換中にこの文字をエンコードするパターンは何ですか? URL オブジェクトのエンコードされたコピーを作成する必要がありますか?

4

3 に答える 3

3

OK、私は次のようなものを思いつきます:

URI uri = new URI(url.getProtocol(), 
                  null /*userInfo*/,
                  url.getHost(), 
                  url.getPort(), 
                  (url.getPath()==null)?null:URLDecoder.decode(url.getPath(), "UTF-8"),
                  (url.getQuery()==null)?null:URLDecoder.decode(url.getQuery(), "UTF-8"),
                  null /*fragment*/);

動作するように見えます。例を次に示します。これが適切な解決策であることを誰かが確認できますか?

編集:クエリがあったときに最初のソリューションに問題があったため、修正しました。

于 2012-11-23T14:34:28.163 に答える
1

URL エンコーディングを使用しますか?

あなたの例から、あなたは現在持っています:

URL url = new URL("http", "google.com", 8080, "/crapy|path with-unwise_characters.jpg");

代わりに、次を使用します。

String path = "/crapy|path with-unwise_characters.jpg"
URL url = new URL("http", "google.com", 8080, URLEncoder.encode(path, "UTF-8"));

これは機能し、標準の URL エンコーディングに従って、パス内のすべての賢明でない文字を処理する必要があります。

于 2012-11-23T14:42:12.543 に答える
1

HTTPClient 4 には、その org.apache.http.client.utils.URIBuilder のオブジェクトがあります。

           URIBuilder builder = 
            new URIBuilder()
        .setScheme(url.getProtocol())
        .setHost(url.getHost())
        .setPort(url.getPort())
        .setUserInfo(url.getUserInfo())
        .setPath(url.getPath())
        .setQuery(url.getQuery());
    URI uri = builder.build();
    return uri;
于 2013-02-04T22:09:12.330 に答える