スペースや % や & などの特殊文字を避けるために URL をエンコードする Java コードが必要です。
5 に答える
URL の構成は、URL のさまざまな部分で許可される文字の規則が異なるため、注意が必要です。たとえば、プラス記号はスペースを表すため、URL のクエリ コンポーネントでは予約されていますが、URL のパス コンポーネントではプラス記号には特別な意味はなく、スペースは "%20" としてエンコードされます。
RFC 2396では、(セクション 2.4.2 で) 完全な URL は常にエンコードされた形式であると説明されています。個々のコンポーネント (スキーム、機関、パスなど) の文字列を取得し、独自のルールに従ってそれぞれをエンコードしてから、それらを完全な URL 文字列に結合します。エンコードされていない完全な URL 文字列を作成してから個別にエンコードしようとすると、パス内のスペースが誤ってプラス記号に変更されるなどの微妙なバグが発生します (RFC 準拠のサーバーは、エンコードされたスペースではなく実際のプラス記号として解釈します)。
Java で URL を作成する正しい方法は、URI
クラスを使用することです。URL コンポーネントを個別の文字列として受け取る複数引数のコンストラクタの 1 つを使用すると、そのコンポーネントの規則に従って各コンポーネントが正しくエスケープされます。このtoASCIIString()
メソッドは、適切にエスケープされ、サーバーに送信できるエンコードされた文字列を提供します。URLをデコードURI
するには、単一文字列のコンストラクターを使用してオブジェクトを作成し、アクセサー メソッド ( などgetPath()
) を使用して、デコードされたコンポーネントを取得します。
URLEncoder
クラスを使用しないでください!その名前にもかかわらず、このクラスは実際には URL エンコーディングではなく、HTML フォーム エンコーディングを行います。エンコードされていない文字列を連結して「エンコードされていない」URL を作成し、URLEncoder
. これを行うと、問題が発生します (特に、パス内のスペースとプラス記号に関する前述の問題)。
手動で行いたくない場合は、Apache Commons - Codec ライブラリを使用してください。あなたが見ているクラスは次のとおりです。org.apache.commons.codec.net.URLCodec
String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
これは非常に簡単な私の解決策です:
URL自体をエンコードする代わりに、渡したパラメーターをエンコードしました。パラメーターはユーザー入力であり、ユーザーは予期しない特殊文字列を入力できるため、これはうまく機能しました:)
String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/
try {
review = URLEncoder.encode(review,"utf-8");
review = review.replace(" " , "+");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String URL = "www.test.com/test.php"+"?user_review="+review;
私はウィザードが書いたことを繰り返しますが、それを追加します:
- クエリ パラメータの場合、HTML エンコーディングは多くの場合、サーバーが期待するものとまったく同じです。これら以外では、
URLEncoder
使用しないでください。 - 最新の URI 仕様はRFC 3986であるため、それを一次情報源として参照する必要があります
このテーマについてしばらく前にブログ記事を書きました: Java: safe character handling and URL building