首页 > 解决方案 > 如何正确编码以下 URL

问题描述

我有一个我喜欢通过 java 应用程序解析的 URL。这些 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_pandemic),我必须对其进行编码。响应。我想对完整的 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 进行编码?

标签: javaurlencoding

解决方案


当上面的代码运行时,您的变量wikiID已经损坏。因此,问题在于您没有向我们展示的代码。

为了证明这一点,这里有一个 jshell 中的快速会话。我在 Windows 上,所以我使用 Unicode 字符转义符\u2013作为破折号字符:

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"

推荐阅读