【问题标题】:Different behavior when space is encoded as + and %20 in a URL在 URL 中将空格编码为 + 和 %20 时的不同行为
【发布时间】:2014-09-22 16:20:40
【问题描述】:

URL 中带有空格的页面无法正确翻译: 即

http://www.streetinsider.com/Press 发布/普莱诺住房市场反映的国家趋势/9778767.html

http://www.streetinsider.com/Press%20Releases/National+Trends+Reflected+in+Plano+Housing+Market/9778767.html

给出 404。请注意“Press Releases”被编码为“Press%20Releases”。

但是,在“新闻稿”编码为“新闻稿+新闻稿”的情况下,以下两个版本可以正常工作。

http://www.streetinsider.com/Press+Releases/National+Trends+Reflected+in+Plano+Housing+Market/9778767.html

使用加号或十六进制空格 %20 可以很好地解析文章。 http://www.streetinsider.com/Press+Releases/National%20Trends%20Reflected%20in%20Plano%20Housing%20Market/9778767.html

+ 和 %20 都代表空格。那为什么会有这种行为。

另外,在 java 中我可以使用什么来获取正确的编码 URL

【问题讨论】:

    标签: java url encoding query-string


    【解决方案1】:

    + 和 %20 都代表空格

    仅在查询字符串中。在 URL 的其他地方,加号是加号,而不是空格。在这种情况下,Web 服务器为两个不同的 URLs

    提供相同的 content

    http://www.streetinsider.com/Press+Releases/National+Trends+Reflected+in+Plano+Housing+Market/9778767.html

    http://www.streetinsider.com/Press+Releases/National%20Trends%20Reflected%20in%20Plano%20Housing%20Market/9778767.html

    但这两个 URL 是不同的,它们不是同一 URL 的替代表示。

    【讨论】:

      【解决方案2】:

      官方+可能只用在查询字符串中(在?之后)。

      这就是 URLEncoder 的用途:

      "?x=" + URLEncoder.encode("Hello World", "UTF-8");
      "?x=" + URLEncoder.encode("ŝi estas ĉarma", "UTF-8");
      
      ?x=Hello+World
      ?x=%C5%9Di+estas+%C4%89arma
      

      更通用的类 URI,遵守要替换的空格规范,使用 %。

      URI uri = new URI("http", "www.streetinsider.com",
          "/Press Releases/National Trends Reflected in Plano Housing Market/9778767.html",
          "?x=ŝi estas ĉarma");
      String u = uri.toString();
      
      http://www.streetinsider.com/Press%20Releases/National%20Trends%20
      Reflected%20in%20Plano%20Housing%20Market/9778767.html#?x=ŝi%20estas%20ĉarma
      

      有时会遇到 URI 作为 File 和其他的泛化,然后必须小心不要在文件名中引入 %20。

      因此,+ 甚至 %20 的 streetinsider 上可能有部分重新映射;为了达到相同的代码。

      【讨论】:

        【解决方案3】:

        你的陈述

        Both + and %20 represent spaces. 
        

        并非在所有情况下都完全正确。

        空格字符只能在一种情况下编码为“+”:application/x-www-form-urlencoded 键值对。

        RFC-1866(HTML 2.0 规范),第 8.2.1 段。小段 1. 说:“表单字段名称和值被转义:空格字符被 `+' 替换,然后保留字符被转义”)。

        以下是 URL 中此类字符串的示例,其中 RFC-1866 允许将空格编码为加号:“http://example.com/over/there?name=foo+bar”。所以,只有在 "?" 之后,空格才可以用加号代替(在其他情况下,空格应该编码为 %20)。这种对表单数据进行编码的方式在后面的HTML规范中也有给出,例如在HTML 4.01规范中寻找有关application/x-www-form-urlencoded的相关段落,等等。

        您提供的 URL 不是包含键/值对的表单数据,它只是 9778767.html 文件的路径:

        http://www.streetinsider.com/Press%20Releases/National+Trends+Reflected+in+Plano+Housing+Market/9778767.html
        

        所以,在这里使用加号是违法的。在这种情况下,正确的 URL 应该如下所示:

        http://www.streetinsider.com/Press%20Releases/National%20Trends%20Reflected%20in%20Plano%20Housing%20Market/9778767.html
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-25
          • 2010-12-10
          • 2011-02-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多