Java URL编码:URLEncoder与URI?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (308)

看看W3 Schools URL编码网页,它说这@应该被编码为%40,并且space应该被编码为%20

我都试过URLEncoderURI,但同样没有上面的正确:

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错误?)

提问于
用户回答回答于

虽然我认为@fge的答案是正确的,因为我使用的是依赖于W3C文章中概述的编码的第三方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;
}
用户回答回答于

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

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

pchar = unreserved / pct-encoded / sub-delims /“:”/“@”

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

信任URI。它做正确的,“合法”的东西。

最后,如果你看看URLEncoderJavadoc,你会发现它说:

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

这是不是一回事由URI规范定义的查询字符串。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励