3

エンコードされている場合とされていない場合がある URL パラメーター値を受け入れる Java アプリを作成しています。パラメータ文字列をエンコードする必要があるかどうかを簡単に判断する方法が必要です。

つまり、boolean needsEncoding(String param)文字列 "foo@test.com" を渡すと true を返し、"foo%40test.com" を渡すと false を返す function が必要です。この考えの問題点は、これがあいまいであるということです。後者の文字列の「%」記号をエンコードする必要があるかどうかは、どうすればわかりますか? これを処理する 1 つの方法は、コントラクトを変更することです。クライアントにエンコードされていない文字列を渡すように要求して、常にエンコードする必要があることを認識できるようにします。考え?

4

5 に答える 5

6

人々が投票できるように、これを提案された回答として入れると思いました:

これを処理する 1 つの方法は、コントラクトを変更することです。クライアントにエンコードされていない文字列を渡すように要求して、常にエンコードする必要があることを認識できるようにします。

于 2008-10-08T17:10:47.853 に答える
1

文字列をデコードし、元の文字列とデコードされた文字列のすべての違いが有効な url エンティティであるかどうかを確認してください。

于 2008-10-08T17:22:22.497 に答える
0

これが私の通常の対処方法です。まず、+ は厄介な特殊なケースであるため、エンコーディングの一部として許可しません。プラスを入力すればプラスです。スペースが必要な場合は、キーボードの下部にある大きなバーを押すことができます。(そして、はい、いくつかの契約の一部としてそれを行いました)。しかし、実際には、クライアントのために一生懸命働いているので、クライアントが自分でエンコードすることを心配する必要がないので、説明することができます.

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とにかく代わりに使用してください)

于 2014-06-08T18:29:37.637 に答える
0

入力で使用java.net.URLDecoderし、入力と出力の文字列値を比較して変化するかどうかを確認できます。のJavadocを見るとURLDecoder、入力文字列に適用してURLデコードが必要かどうかを判断するビジネスロジックが説明されています。

結果を取得する必要があり、booleanその結果を取得するためにデコード試行のオーバーヘッドを発生させたくないboolean場合は、いつでもURLDecoderクラスのソース コードを解読して、URL デコードが必要かどうかを判断するために使用する同じビジネス ロジックを使用できます。

于 2008-10-08T20:15:46.547 に答える
0

文字列が URL エンコードされていることを示します。

  1. スペースはありませんが、プラス記号がたくさんあります。
  2. すべてのパーセント記号の後には 2 桁の数字が続きます。
  3. a..b、A..B、0..9、"."、"_"、"-"、"*"、"%"、"+" 以外の文字は含まれません。

ただし、ここでは契約を変更することをお勧めします。

于 2008-10-08T17:16:09.980 に答える