23

查看W3 Schools URL 编码网页,它说@应该编码为%40space应该编码为%20

我都尝试过URLEncoderand URI,但以上都没有正确:

import java.net.URI;
import java.net.URLEncoder;

public class Test {
    public static void main(String[] args) throws Exception {

        // Prints me%40home.com (CORRECT)
        System.out.println(URLEncoder.encode("me@home.com", "UTF-8"));

        // Prints Email+Address (WRONG: Should be Email%20Address)
        System.out.println(URLEncoder.encode("Email Address", "UTF-8"));

        // http://www.home.com/test?Email%20Address=me@home.com
        // (WRONG: it has not encoded the @ in the email address)
        URI uri = new URI("http", "www.home.com", "/test", "Email Address=me@home.com", null);
        System.out.println(uri.toString());
    }
}

出于某种原因,URLEncoder电子邮件地址是否正确但不是空格,并且URI是否空格货币但不是电子邮件地址。

我应该如何编码这两个参数以与 w3schools 所说的正确(或者 w3schools 错误?)

4

2 回答 2

43

尽管我认为@fge 的答案是正确的,因为我使用的是依赖于 W3Schools 文章中概述的编码的第 3 方 Web 服务,但我遵循了Java 的答案,相当于 JavaScript 的 encodeURIComponent 产生相同的输出?

public static String encodeURIComponent(String s) {
    String result;

    try {
        result = URLEncoder.encode(s, "UTF-8")
                .replaceAll("\\+", "%20")
                .replaceAll("\\%21", "!")
                .replaceAll("\\%27", "'")
                .replaceAll("\\%28", "(")
                .replaceAll("\\%29", ")")
                .replaceAll("\\%7E", "~");
    } catch (UnsupportedEncodingException e) {
        result = s;
    }

    return result;
}
于 2013-01-20T12:59:10.217 回答
16

URI 语法由RFC 3986定义(查询字符串的允许内容在第 3.4 节中定义)。JavaURI遵守此 RFC,在其Javadoc中提到了一些注意事项。

您会注意到pchar语法规则由以下内容定义:

pchar = unreserved / pct-encoded / sub-delims / ":" / "@"

这意味着 a在查询字符串中@合法的。

信任 URI。它做正确的、“合法的”事情。

最后,如果您查看URLEncoder 的 Javadoc,您会看到它声明:

此类包含用于将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。

URI 规范定义的查询字符串不同。

于 2013-01-14T16:03:04.940 回答