Как правильно кодировать следующий URL - PullRequest
0 голосов
/ 02 мая 2020

У меня есть URL, который я люблю анализировать в приложении java. Эти URL могут содержать символы, которые нельзя вызвать:

url.openStream()

пример:

https://en.wikipedia.org/w/api.php?format=json&action=query&prop=langlinks&titles=2019–20_coronavirus_pandemic&redirects=&lllimit=400

есть символ - в нем (2019–20_coronavirus_pandemi c), который я должен кодировать. Соответственно Я хотел бы закодировать полный URL-адрес, поскольку он может содержать другие специальные символы.

Я делаю это следующим образом, что не работает для меня:

String urlEncoded = URLEncoder.encode(wikiID, StandardCharsets.UTF_8.toString());
String sURL = "https://en.wikipedia.org" + "/w/api.php?format=json&action=query&prop=langlinks&titles=" + urlEncoded + "&redirects=&lllimit=400";
    URL url = new URL(sURL);
    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

URLEncoder.encode кодирует с 2019–20 по 2019% 3F20, что неверно, соотв. не может быть вызван. правильное кодирование будет: 2019% E2% 80% 9320

Как правильно кодировать URL по коду?

1 Ответ

0 голосов
/ 02 мая 2020

Ваша переменная wikiID уже повреждена к моменту запуска кода выше. Поэтому проблема в коде, который вы нам не показали.

Чтобы доказать это, вот краткий сеанс в jshell. Я на Windows, поэтому я использую escape-символ Unicode \u2013 для символа en-da sh:

jshell> import java.net.URLEncoder;

jshell> import java.nio.charset.StandardCharsets;

jshell> URLEncoder.encode("2019\u20132020_coronavirus_pandemic", StandardCharsets.UTF_8.toString());
$3 ==> "2019%E2%80%932020_coronavirus_pandemic"

jshell> URLEncoder.encode("2019?2020_coronavirus_pandemic", StandardCharsets.UTF_8.toString());
$4 ==> "2019%3F2020_coronavirus_pandemic"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...