href
URIを生成する必要があります。パーセントエンコーディングが必要な予約文字を除いて、すべて簡単です。たとえば、へのリンクは次の/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 の両方が同じように動作することを確認しました。