hrefURIを生成する必要があります。パーセントエンコーディングが必要な予約文字を除いて、すべて簡単です。たとえば、へのリンクは次の/some/path;elementように表示されます(単一のエンティティを表す<a href="/some/path%3Belement">ことはわかっています)。path;element
最初はこれを行う Java ライブラリを探していましたが、自分で何かを書くことになりました (この質問は Java 固有ではないため、Java で失敗したものについては以下を参照してください)。
したがって、RFC 3986は、いつエンコードしないかを提案しています。私が読んだように、これは、キャラクターがunreserved (ALPHA / DIGIT / "-" / "." / "_" / "~")クラスに分類されるときに発生するはずです。ここまでは順調ですね。しかし、逆の場合はどうでしょうか。%RFC では、パーセント ( ) は常にエンコードが必要であるとのみ言及されています。しかし、他の人はどうですか?
質問:予約されていないものはすべて、パーセントでエンコードできる/すべきであると仮定するのは正しいですか? たとえば、左大括弧(は必ずしもエンコードする必要はありませんが、セミコロンは必要です;。/firstエンコードしないと、次のときに *を探すことになります<a href="/first;second">。しかし、次のよう<a href="/first(second">にすると、予想どおり、常に を探してしまい/first(secondます。私を混乱させているのは、RFC に関する限り、 と の両方が同じクラス(に;あるということです。sub-delims私が想像するように、予約されていないものすべてをエンコードすることは安全な賭けですが、ローカライズされた URI に関しては、SEO 性、ユーザー フレンドリ性についてはどうでしょうか?
さて、Java ライブラリで何が失敗したか。私はそれをやってみまし
new java.net.URI("http", "site", "/pa;th", null).toASCIISTring()
たが、これhttp://site/pa;thは良くありません。同様の結果が観察されました:
javax.ws.rs.core.UriBuilder- Spring の UriUtils - 私は両方を試しまし
encodePath(String, String)たencodePathSegment(String, String)
[*]をクリックしたときにサーバー側/firstで呼び出した結果ですHttpServletRequest.getServletPath()<a href="/first;second">
編集:おそらく、この動作は Tomcat で観察されたことに言及する必要があります。また、Tomcat 6 と 7 の両方が同じように動作することを確認しました。