これが私の通常の対処方法です。まず、+ は厄介な特殊なケースであるため、エンコーディングの一部として許可しません。プラスを入力すればプラスです。スペースが必要な場合は、キーボードの下部にある大きなバーを押すことができます。(そして、はい、いくつかの契約の一部としてそれを行いました)。しかし、実際には、クライアントのために一生懸命働いているので、クライアントが自分でエンコードすることを心配する必要がないので、説明することができます.
java.net.URLDecoder.decode
次に、「+」ケースを削除するように書き直しました。(実際には、そのプロジェクトで使用しているユーティリティ クラスにカット アンド ペーストし、4 行まで削除するだけです)。
次に、取得したすべてのものについて、デコーダー、エンコーダーの順に実行します。これにより、エンコードされている場合はデコードして再エンコードされ、エンコードされていない場合はエンコードされます。SO 何年も前に誰かからこのヒントをもらいましたが、誰に適切なクレジットを与えるべきか思い出せません。
だから私は次のようになります:
String properlyencodedstring =
java.net.URLEncoder.encode(LocalDecoder.localdecode(someformdatastring),"UTF-8");
これを微調整する必要があるのは、入力して処理する必要がある URL の大規模なグループを含むデータの場合だけです。私の仮定を切り替えてinput type="url"
(古いブラウザー用のある種の JavaScript ポリフィルを使用して) 使用し、次のように前処理します。.replaceAll("+", " ")
、その場合、入力できるスペースがないためです。(そしておそらく、java.net.URI
とにかく代わりに使用してください)