6

次のようなURI文字列があります。

http://www.christlichepartei%F6sterreichs.at/steiermark/

この文字列を使用してjava.lang.URIインスタンスを作成していますが、成功しますが、ホストを取得する場合はnullが返されます。上記のように正確に入力すると、OperaとFirefoxもこのURLを窒息させます。しかし、URIクラスが無効な場合、URISyntaxExceptionをスローするべきではありませんか?その場合、URIが不正であることをどのように検出できますか?

URLDecoderを使用して文字列をデコードすると、同じように動作します。

http: //www.christlicheparteiösterreichs.at/steiermark /

現在、これはOperaとFirefoxで受け入れられていますが、java.net.URIはまだそれを好みません。このようなURLをどのように処理できますか?

ありがとう

4

3 に答える 3

4

Java 6 にはIDN、国際化されたドメイン名を処理するためのクラスがあります。したがって、次の例では、ホスト名がエンコードされた URI が生成されます。

URI u = new URI("http://" + IDN.toASCII("www.christlicheparteiösterreichs.at") + "/steiermark/");
于 2010-09-27T12:20:54.560 に答える
2

ホスト名で非 ASCII 文字をエンコードする正しい方法は、「Punycode」として知られています。

于 2010-09-27T12:15:35.333 に答える
2

適切なコンストラクターを選択すると、URIはURISyntaxExceptionをスローします。

URI someUri=new URI("http","www.christlicheparteiösterreichs.at","/steiermark",null);

java.net.URISyntaxException: インデックス 28 のホスト名に不正な文字があります: http://www .christlicheparteiösterreichs.at/steiermark

これを修正するには、 IDNを使用できます。

URI someUri=new URI("http",IDN.toASCII("www.christlicheparteiösterreichs.at"),"/steiermark",null);
System.out.println(someUri);
System.out.println("host: "+someUri.getHost()));

出力:

http://www.xn--christlicheparteisterreichs-5yc.at/steiermark

ホスト: www.xn--christlicheparteisterreichs-5yc.at

鶏卵問題に関する更新:

URLに仕事を任せることができます:

public static URI createSafeURI(final URL someURL) throws URISyntaxException
{
return new URI(someURL.getProtocol(),someURL.getUserInfo(),IDN.toASCII(someURL.getHost()),someURL.getPort(),someURL.getPath(),someURL.getQuery(),someURL.getRef());    
}


URI raoul=createSafeURI(new URL("http://www.christlicheparteiösterreichs.at/steiermark/readme.html#important"));

これは単なるクイック ショットであり、URL から URI への変換に関するすべての問題がチェックされているわけではありません。出発点として使用してください。

于 2010-09-27T15:11:14.687 に答える