2012-11-23 5 views
5

私の場合はunwise characters (RFC 2396)のパスを含むURLオブジェクトを持っています。 (パイプ)文字。 これをURIに安全に変換する必要がありますが、URL.toURI()は例外をスローします。私はURL documentationを読んだが、この部分は私のために混乱して賢明でない文字がある場合、URL toURIをどのように変換するのですか?

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

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

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*/); 

が見える、here is an example

答えて

2

OK、私はこのような何かを思い付きます。これが適切な解決策であることを確かめることができますか?

編集initial solutionにはクエリがあったときにいくつか問題があったので修正しました。

+0

この方法では、それはURLがURLの一部をエンコードしてURLを変更し、私の解決策を参照してください –

+0

はいあなたは正しいです私はいくつかの時間自我は、ideone.com(最初のリンクを参照してください)私は私の解決策を修正したことに気づいたと私はこの問題を明らかにする追加のテストケースを追加しました。私はあなたのソリューションをチェックします、それは良く見えます。 –

+0

jmeterに投稿したバグは昨日修正されていますので、夜間に –

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エンコードあたりのように、パス内のすべての愚かな文字を仕事と処理する必要があります。

+0

これはOKソリューションですが、私の主な目的はURIへの変換であり、私のソリューションはより直接的です。特に、サードパーティのコードからURLを作成しないようにしました。 –

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; 
関連する問題