Java URL 编码:URLEncoder 与 URI

Posted

技术标签:

【中文标题】Java URL 编码:URLEncoder 与 URI【英文标题】:Java URL encoding: URLEncoder vs. 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() 所做的事情。我会检查你的库。 【参考方案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 服务所期望的:***.com/questions/607176/… 从那时起,我开发了一个库,它可以做 URI 模板 (RFC 6570),它更加强大;) 这很奇怪...... URI 的 Javadocs 声明它遵循 RFC 2396,即使在 Java 8 中,其中 RFC 2396 来自 1998 年,它已经过时 RFC 3986 自 2005 年起

以上是关于Java URL 编码:URLEncoder 与 URI的主要内容,如果未能解决你的问题,请参考以下文章

Java URLEncoder改变特殊字符?

Java后台URL转码-Js编码和Java后台解码

web之中文编码与解码

java里如何将字符转为url码?

java中编码与解码分别指啥?

java url编码解码