クエリ文字列パラメータのJava URLエンコード 質問する

クエリ文字列パラメータのJava URLエンコード 質問する

URLがあるとします

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

ユーザーが入力したクエリは次のようになります。

ランダムな単語 £500 銀行 $

結果が適切にエンコードされた URL になるようにします。

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

これを実現する最善の方法は何でしょうか? URLEncoderURI/URL オブジェクトを作成してみましたが、どれもうまくいきませんでした。

ベストアンサー1

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.name()charset 引数として使用し、まだ Java 7 以降を使用していない場合は を使用します"UTF-8"


+クエリ パラメータ内のスペースは ではなくで表されますが%20、これは正当です。 は通常、クエリ文字列 ( の後の部分) ではなく、URI 自体 (URI クエリ文字列区切り文字 の前の部分)%20内のスペースを表すために使用されます。??

また、3つの方法があることにも注意してくださいencode()。1つはCharset2番目の引数がなく、もう1つはString2番目の引数があり、チェック例外をスローします。Charset引数のない方法は非推奨です。決して使用せず、常にCharset引数を指定してください。javadocUTF-8エンコードの使用を明示的に推奨している。RFC3986そしてウィキペディア

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

参照:

おすすめ記事