2012-01-27 15 views
2

これらのURLはユーザーによって更新されるため、私はいくつかのURLを毎日サーバーでテストする必要があります。ただし、これらのURLには、ドイツ語のウムラウトのような奇妙な文字が含まれています。 Basicly私がやっていることです:アイブ氏が見つけたものサーバーに送信されたURLのエンコーディング(クエリではない)

for every URL in the list to check 
    URL u = new URL(the_url); 
    u.openConnection(..); 
    // read the content and handle it 

は、org.apache.commons.codec.net.URLCodecはのQueryStringに貼り付けるために、文字列をエンコードするための罰金であるということです、彼らの六角対応に奇妙なURLをエンコードするよう適切ではありません。ここではURLのいくつかの例は以下のとおりです。

  • ます。http:// www.example COM/U /überraum-03/
  • ます。http:// www.example COM/U /サンパウロ - サンパウロ - 男/
  • http:// www.example.com/jp/hokeon-hellstrom/

最初の希望の結果は次のとおりです。

  • ます。http:// www.example COM/U /%C3%9berraum-03/

実際のURLに特殊文字を変換するためのApache CommonsのやJava自体に任意のライブラリがあり、 (クエリーストリングではなく、同じ種類の文字を置き換えない)?

ありがとうございます。

編集 Firefoxが "yr.no/place/Norway/Nordland/Moskenes/Å/data.html" を翻訳します。 "yr.no/place/Norway/Nordland/Moskenes/%C3%85/data.html"に入力してください(最初のURLを入力してEnterキーを押し、URLを文書にコピーしてください)。これが実際の翻訳なので、私が探しているのはこの効果です。最も起こりそうなことは、Åが悪いことを知っているか、複数のバージョンを試しているか、サーバーの "Location"ヘッダーを受け入れていることです。どちらの方法でも、URLのサブセットのみに "Å"から "%C3%85"までの情報があります。これが私たちが必要とする機能です。

編集 私は、commentorによって与えられたコードが悲しいことにうまく動作しないことを確認しました。たとえば、次のように試してみてください:

try{ 
     String urlStr = "http://www.yr.no/place/Norway/Nordland/Moskenes/Å/data.html"; 
     URL u=new URL(urlStr); 
     URI uri = new URI(u.getProtocol(), 
        u.getUserInfo(), u.getHost(), u.getPort(), 
        u.getPath(), u.getQuery(), 
        null); // removing ref 

     URL urlObj = uri.toURL(); 
     HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection(); 
     connection.setInstanceFollowRedirects(false); 
     connection.connect(); 

     for (int i=0;i<connection.getHeaderFields().size();i++) 
      System.out.println(connection.getHeaderFieldKey(i)+": "+connection.getHeaderField(i)); 
     System.exit(0); 
    }catch(Exception e){e.printStackTrace();}; 

奇妙なことに、エンコードされた部分も機能しません。

+0

http://www.example.com/u/håkon-hellström/

変更は私が(他の文字がエンコードされている)だけASCIIに結果のURLを制限するために私の答えを更新しました。私はこれがあなたが探している結果だと信じています。 – Dev

答えて

1

あなたは、有効なURI(RFC 2396準拠)であるURLが必要な場合は、あなたが提供するすべての3つのサンプル文字列がRFC 2396に準拠しているとそうでない言われていることのJava

String urlString = "http://www.example.com/u/håkon-hellström/"; 

    URL url = new URL(urlString); 
    URI uri = new URI(url.getProtocol(),url.getAuthority(), url.getPath(), url.getQuery(), url.getRef()); 
    url = new URL(uri.toASCIIString()); 

にこのようなものを作成することができますコード化する必要があります。あなたが提供したURLの権限部分のスペースが誤植であると仮定しています。

編集:私は上記のコードブロックを更新

URI.toASCIIString()を使用すると、結果のURIをUS-ASCII文字(他の文字がエンコードされている)だけに制限できます。結果の文字列を使用して、新しい有効なURLを作成できます。

http://www.example.com/u/h%C3%A5kon-hellstr%C3%B6m/

+0

ありがとうございます。 – user1174105

+0

ありがとうございました。スペースは、新規参加者のためのstackoverflow max-2-linksポリシーによるものです。 問題は次のとおりです。あなたがここに書くコードは、私が書いたコードと同じです。しかし、それは動作しません。また、最新のブラウザーのすべてが、サーバーに送信したURLを16進数のカウンターパーツに変更することも確認できます。 RFC 2396に準拠しているかどうかはわかりませんが、明らかに機能しません。 でも、「http://www.yr.no/place/Norway/Nordland/Moskenes/Å/data.html」を「http://www.yr.no/place/Norway/Nordland/Moskenes/」に翻訳しています。 %C3%85/data.html " – user1174105

+0

私は、URI.toASCIIString()を使用するように答えを更新しました。これは、非ASCII文字をエンコードして、望ましい結果を与えるはずです。 – Dev

関連する問題