URLがあるとします
http://example.com/query?q=
ユーザーが入力したクエリは次のようになります。
ランダムな単語 £500 銀行 $
結果が適切にエンコードされた URL になるようにします。
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
これを実現する最善の方法は何でしょうか? URLEncoder
URI/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つはCharset
2番目の引数がなく、もう1つはString
2番目の引数があり、チェック例外をスローします。Charset
引数のない方法は非推奨です。決して使用せず、常にCharset
引数を指定してください。javadocUTF-8エンコードの使用を明示的に推奨している。RFC3986そしてウィキペディア。
その他の文字はすべて安全ではなく、まず何らかのエンコード方式を使用して 1 バイト以上のバイトに変換されます。次に、各バイトは 3 文字の文字列 "%xy" で表されます。ここで、xy はバイトの 2 桁の 16 進数表現です。推奨されるエンコード方式は UTF-8 です。ただし、互換性の理由から、エンコードが指定されていない場合は、プラットフォームのデフォルトのエンコードが使用されます。