【问题标题】:How to encode URL to avoid special characters in Java? [duplicate]如何对 URL 进行编码以避免 Java 中的特殊字符? [复制]
【发布时间】:2011-06-02 01:31:12
【问题描述】:

我需要 java 代码来编码 URL 以避免特殊字符,例如空格和 % 和 & ...等

【问题讨论】:

  • 这类问题正是某些网站永远不会在其 URL 中使用需要转义/编码的字符的原因。 StackOverflow 似乎是这样一个站点(只需查看干净的 URL)。我认为链接到 URL 中的文件的人,例如,他们的名称中有空格字符(以及为此在文件中使用空格字符的人)应该被枪杀。而那些争论这个事实的人更是如此;)
  • (@fmucar 在下面的回答中建议重复)。

标签: java url-encoding


【解决方案1】:

如果您不想手动执行此操作,请使用 Apache Commons - Codec 库。您正在查看的课程是:org.apache.commons.codec.net.URLCodec

String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);

【讨论】:

  • 为什么这个答案被否决了?
  • 只是一个注释。 URLCodec 旨在替代 URLEncoder/URLDecoder。这并不意味着对整个 url 进行编码,这就是示例所显示的。这意味着即使 http:// 变成了 http%3A%2F%2F。除非那是你真正想要做的。
  • 两者都给了我相同的“错误”结果 URLCodec urlCodec = new URLCodec(); System.out.println(urlCodec.encode("FOO BAR")); // FOO+BAR System.out.println(URLEncoder.encode("FOO BAR", "UTF-8"));美食+酒吧
【解决方案2】:

URL 构造很棘手,因为 URL 的不同部分对于允许使用的字符有不同的规则:例如,加号保留在 URL 的查询组件中,因为它代表一个空格,但在 URL 的路径组件中URL,加号无特殊含义,空格编码为“%20”。

RFC 2396 解释(在第 2.4.2 节中)完整的 URL 始终是其编码形式:您获取各个组件(方案、权限、路径等)的字符串,根据其自身对每个组件进行编码规则,然后将它们组合成完整的 URL 字符串。尝试构建一个完整的未编码的 URL 字符串,然后对其进行单独编码会导致一些细微的错误,例如路径中的空格被错误地更改为加号(符合 RFC 的服务器会将其解释为真正的加号,而不是编码的空格)。

在 Java 中,构建 URL 的正确方法是使用 URI 类。使用将 URL 组件作为单独字符串的多参数构造函数之一,它将根据该组件的规则正确转义每个组件。 toASCIIString() 方法为您提供了一个经过正确转义和编码的字符串,您可以将其发送到服务器。要解码 URL,请使用单字符串构造函数构造一个URI 对象,然后使用访问器方法(例如getPath())来检索解码的组件。

不要使用URLEncoder 类!尽管名称如此,但该类实际上是进行 HTML 表单编码,而不是 URL 编码。 正确地连接未编码的字符串以生成“未编码”的 URL,然后通过 URLEncoder 传递它。这样做会导致问题(尤其是前面提到的关于路径中的空格和加号的问题)。

【讨论】:

  • 我正在尝试编写 mysekf .... 是否正确? public static String encode(String str) { StringBuilder sb=new StringBuilder(); for(int i=0;i
  • @adham,不,正确的 URL 编码不仅仅是转义这三个字符。该代码可能会为 一些 URL 生成正确的结果,但有很多它无法正确处理。只需使用 URI 类。
  • 是的,我知道还有很多其他字符 .. 但是请你给一个 URI 类的简单示例
  • 从测试来看,您似乎仍然需要手动将查询中的空格替换为“+”号。我在某个地方犯了错误吗?
  • @EdwardFalk,你是对的,URI 似乎没有将查询字符串中的空格转换为“+”。我可以发誓这样做,因为我在解决自己的代码中的空格/加号问题时了解了 URI 类,但那是几年前的事了,我不记得细节了。由于加号实际上是application/x-www-form-urlencoded MIME 类型的一部分,而不是URI 语法本身,我想在将查询字符串放入URI 之前(仅)通过URLEncoder 运行查询字符串是有意义的。不过,我需要重新考虑甚至重写我的答案。
【解决方案3】:

我会回应 Wyzard wrote 的内容,但要补充一点:

  • 对于查询参数,HTML 编码通常正是服务器所期望的;在这些之外,不应该使用URLEncoder是正确的
  • 最新的 URI 规范是 RFC 3986,因此您应该将其称为主要来源

不久前我写了一篇关于这个主题的博文:Java: safe character handling and URL building

【讨论】:

    【解决方案4】:

    这是我的解决方案,非常简单:

    我没有对 url 本身进行编码,而是对我传递的参数进行编码,因为参数是用户输入,用户可以输入任何意外的特殊字符字符串,所以这对我来说很好:)

    String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/
    try {
        review = URLEncoder.encode(review,"utf-8");
        review = review.replace(" " , "+");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    String URL = "www.test.com/test.php"+"?user_review="+review;
    

    【讨论】:

    • 对不起,我不小心这样做了,但这个解决方案有效。
    • 我也在使用相同的,但这只会在编码字符串时生成 %2c 或某些字符。
    【解决方案5】:

    我也花了很长时间处理这个问题,所以这是我的解决方案:

    String urlString2Decode = "http://www.test.com/äüö/path with blanks/";
    String decodedURL = URLDecoder.decode(urlString2Decode, "UTF-8");
    URL url = new URL(decodedURL);
    URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
    String decodedURLAsString = uri.toASCIIString();
    

    【讨论】:

    • Idea Intellij 添加了将"UTF-8" 转换为StandardCharsets.UTF_8 的建议,并在代码重新格式化时自动执行。然后它会破坏代码 - 出现错误java: incompatible types: java.nio.charset.Charset cannot be converted to java.lang.String。我通过使用 StandardCharsets.UTF_8.name() 而不是 "UTF-8" 来修复它
    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多