【问题标题】:Java URL encoding: URLEncoder vs. URIJava URL 编码:URLEncoder 与 URI
【发布时间】:2012-12-28 14:46:00
【问题描述】:

查看W3 Schools URL encoding webpage,它说@ 应该编码为%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 是否错误?)保持一致

【问题讨论】:

  • 如果您正在查看 w3schools.com,那么您做错了。参考this
  • @Srinivas 我正在使用的网络服务明确忽略请求,除非参数按照 w3schools 网页上的说明进行编码:(
  • URLEncoder 不按照 URL 规范进行编码,而是按照 application/x-www-form-urlencoded MIME 格式(这是大多数应用程序服务器对参数键/值的期望。)URI 类型编码根据其文档 - 也就是说,它不是一个完整的 URL 构建器。请注意,URI 的不同部分有不同的规则。更多分析请见this post
  • @McDowell 是的,我想我应该问我如何让 java 做 JavaScript 的 encodeURIComponent() 所做的事情。我会检查你的库。

标签: java url urlencode


【解决方案1】:

虽然我认为@fge 的答案是正确的,因为我使用的是依赖于 W3Schools 文章中概述的编码的第 3 方网络服务,但我遵循了来自 Java equivalent to JavaScript's encodeURIComponent that produces identical output? 的答案

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;
}

【讨论】:

  • 您忘记了 & 符号,这对于解码 url 很重要(对于 GET 或 POST 方法),因为它是分隔请求中键的符号
  • 我不得不指出 w3schools 不是 W3C。它们完全不同。
【解决方案2】:

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

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

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

这意味着@ 在查询字符串中是合法

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

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

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

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

【讨论】:

  • 我认为我应该问的问题是如何让 java 以与 JavaScript encodeURIComponent 相同的方式对 URL 进行编码,因为这是接收 web 服务所期望的:stackoverflow.com/questions/607176/…
  • 从那时起,我开发了一个库,它可以做 URI 模板 (RFC 6570),它更加强大;)
  • 这很奇怪...... URI 的 Javadocs 声明它遵循 RFC 2396,即使在 Java 8 中,其中 RFC 2396 来自 1998 年,它已经过时 RFC 3986 自 2005 年起
猜你喜欢
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多