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
。
URLEncoder
和 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 是否错误?)保持一致
【问题讨论】:
如果您正在查看 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的主要内容,如果未能解决你的问题,请参考以下文章