1. ホーム
  2. java

[解決済み] JavaによるHTTP URLアドレスのエンコード

2022-03-24 06:51:12

質問

私のJavaスタンドアローンアプリケーションは、ユーザーからURL(ファイルを指す)を取得し、私はそれをヒットしてそれをダウンロードする必要があります。私が直面している問題は、HTTP URLアドレスを適切にエンコードすることができないことです...

URL:  http://search.barnesandnoble.com/booksearch/first book.pdf

java.net.URLEncoder.encode(url.toString(), "ISO-8859-1");

は私を返します。

http%3A%2F%2Fsearch.barnesandnoble.com%2Fbooksearch%2Ffirst+book.pdf

しかし、私が欲しいのは

http://search.barnesandnoble.com/booksearch/first%20book.pdf

(スペースは %20 で置換)

だろう URLEncoder は、HTTPのURLをエンコードするようには設計されていません...。JavaDocには"Utility class for HTML form encoding"と書いてありますが...。他に方法はないのでしょうか?

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

その java.net.URI クラスは、URL のドキュメントにある

<ブロッククオート

URIクラスは、特定の状況下でその構成フィールドのエスケープを行うことに注意してください。URL のエンコードとデコードを管理するために推奨される方法は、URI クラスを使用することです。

のように、複数の引数を持つコンストラクタのいずれかを使用します。

URI uri = new URI(
    "http", 
    "search.barnesandnoble.com", 
    "/booksearch/first book.pdf",
    null);
URL url = uri.toURL();
//or String request = uri.toString();

(URIの単一引数コンストラクタは、不正な文字をエスケープしない)


上記のコードでエスケープされるのは不正な文字のみで、ASCII以外の文字はエスケープされません(fatihさんのコメント参照)。
その toASCIIString メソッドを使用すると、US-ASCII 文字だけを含む String を取得できます。

URI uri = new URI(
    "http", 
    "search.barnesandnoble.com", 
    "/booksearch/é",
    null);
String request = uri.toASCIIString();


のようなクエリを持つURLの場合 http://www.google.com/ig/api?weather=São Paulo の場合、5パラメータ版のコンストラクタを使用します。

URI uri = new URI(
        "http", 
        "www.google.com", 
        "/ig/api",
        "weather=São Paulo",
        null);
String request = uri.toASCIIString();