エスケープする必要がある文字を含む可能性のあるコンポーネント パーツは、URI に連結される前に、URLEncoder を使用して既にエスケープされている必要があります。
帯域外の文字 (スペース、"<>[]{}\|^`、および非 ASCII バイトなど) を含む URI がある場合、それは実際には URI ではありません。次の方法で修正を試みることができます。手動で % エスケープしますが、これは最終的な修正操作であり、標準形式のエンコーディングではありません. これは通常、ユーザー入力から潜在的に不正な URI を受け入れる場合に必要ですが、標準化された操作ではなく、私は使用しませんあなたのためにそれを行う組み込みのJavaライブラリ関数を知りません.RegExpで何かを自分でハックする必要があるかもしれません.
逆に、(URLDecoder を使用して) 各部分をアンエスケープする前に、URI をコンポーネント部分 (それぞれ個別のパス部分、クエリパラメーターの名前と値など) に分解する必要があります。一度に URI 全体を % デコードする賢明な方法はありません。「区切り文字にデコードされない % エスケープをデコードする」(/?=&;% など) こともできますが、URI 処理標準に準拠していない奇妙な矛盾した文字列が残ることになります。
URLEncoder/URLDecoder は、名前と値の両方の URI クエリ コンポーネントを処理するのに適しています。ただし、それらはURI パス パーツ コンポーネントの処理には適していません。違いは、「+」文字がパス部分のスペースを意味しないことです。これは、単純な文字列置換で修正できます。URLEncoding の後で、'+' を '%20' に置き換えます。URLDecoding の前に、「+」を「%2B」に置き換えます。パスにスペースまたはプラスを含むセグメントを含める予定がない場合は、違いを無視できます。