1. ホーム
  2. java

[解決済み] クエリ文字列パラメータのJava URLエンコーディング

2022-03-19 07:43:50

質問

あるURLがあるとする

http://example.com/query?q=

というような、ユーザーから入力されたクエリーがあるのですが。

ランダムワード £500 bank $

結果を正しくエンコードされたURLにしたい。

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

これを実現するには、どうしたらいいのでしょうか?私が試したのは URLEncoder を作成したり、URI/URLオブジェクトを作成したりしましたが、どれもなかなかうまくいきません。

どのように解決するのですか?

URLEncoder が、その方法です。をエンコードすることだけを念頭に置く必要があります。 のみ は、URL全体ではなく、個々のクエリ文字列パラメータ名および/または値であり、もちろんクエリ文字列パラメータ分離文字 & また、パラメータ名と値の区切り文字である = .

String q = "random word £500 bank $";
String url = "https://example.com?q=" + URLEncoder.encode(q, StandardCharsets.UTF_8);

まだJava 10以降でない場合は StandardCharsets.UTF_8.toString() を charset 引数として指定するか、あるいは Java 7 以降では "UTF-8" .


クエリパラメータに含まれるスペースは + ではなく %20 であり、正規に有効である。その %20 は通常、URI自体のスペースを表すために使用されます(URI-クエリ文字列の区切り文字である ? の後の部分)ではなく、クエリ文字列の中にあります。 ? ).

また、3つの encode() メソッドがあります。1つは Charset を第2引数として、もう1つは String を第二引数として渡すと、チェックされた例外が投げられます。一方 Charset 引数は非推奨です。決して使用せず、必ず Charset 引数で指定します。また ジャバドック で義務付けられているように、UTF-8 エンコードを使用するよう明示的に推奨しています。 RFC3986 W3C .

それ以外の文字は安全ではなく、まず何らかの符号化方式で1つ以上のバイトに変換される。そして、各バイトは3文字の文字列 "%xy"で表され、xy はそのバイトの2桁の16進数表現となる。 推奨されるエンコード方式はUTF-8です。 . ただし、互換性の観点から、エンコーディングが指定されていない場合は、そのプラットフォームのデフォルトエンコーディングが使用されます。

こちらもご覧ください。