代码之家  ›  专栏  ›  技术社区  ›  BC.

URL编码空格字符:+还是%20?

  •  624
  • BC.  · 技术社区  · 15 年前

    URL中的空格何时编码为 + ,什么时候编码到 %20 是吗?

    4 回复  |  直到 5 年前
        1
  •  369
  •   Timothy Jones    12 年前

    Wikipedia (添加了强调和链接):

    当已经输入到HTML表单中的数据被提交时,表单字段名和值被编码,并通过get或post方法,或者,历史上,通过电子邮件发送到HTTP请求消息中的服务器。 默认情况下使用的编码基于通用URI百分比编码规则的早期版本,其中 number of modifications 例如换行规范化,用“+”替换空格而不是“%20”。 以这种方式编码的数据的mime类型是application/x-www-form-urlencoded,目前在html和xforms规范中定义它(仍然是非常过时的方式)。

    所以, 真实的 编码使用百分比 %20 而URL中的表单数据是使用 + .所以你很可能只看到 + 在URL中的查询字符串中 ? .

        2
  •  233
  •   Peter Mortensen John Conde    5 年前

    这种混乱是因为到今天URL仍然是“坏的”。

    采取“ http://www.google.com “例如。这是一个URL。URL是统一的资源定位器,实际上是指向网页的指针(在大多数情况下)。自1994年的第一个规范以来,URL实际上有一个非常明确的结构。

    我们可以提取有关 网址:http://www.google.com “URL:

    +---------------+-------------------+
    |      Part     |      Data         |
    +---------------+-------------------+
    |  Scheme       | http              |
    |  Host         | www.google.com    |
    +---------------+-------------------+
    

    如果我们查看更复杂的URL,例如:

    https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third

    我们可以提取以下信息:

    +-------------------+---------------------+
    |        Part       |       Data          |
    +-------------------+---------------------+
    |  Scheme           | https               |
    |  User             | bob                 |
    |  Password         | bobby               |
    |  Host             | www.lunatech.com    |
    |  Port             | 8080                |
    |  Path             | /file;p=1           |
    |  Path parameter   | p=1                 |
    |  Query            | q=2                 |
    |  Fragment         | third               |
    +-------------------+---------------------+
    
    https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
    \___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
      |      |    |          |          |      | \_/  |    |
    Scheme User Password    Host       Port  Path |   | Fragment
            \_____________________________/       | Query
                           |               Path parameter
                       Authority
    

    每个部分的保留字符是不同的。

    对于HTTP URL,路径片段部分中的空格必须编码为“%20”(不是,绝对不是“+”),而路径片段部分中的“+”字符可以不编码。

    现在,在查询部分,空格可以被编码为“+”(为了向后兼容:不要试图在URI标准中搜索它)或“%20”,而“+”字符(由于这种模糊性)必须转义到“%2b”。

    这意味着“蓝色+浅蓝色”字符串在路径和查询部分中的编码必须不同:

    http://example.com/blue+light%20blue?blue%2Blight+blue “。

    从中可以推断,如果没有对URL结构的语法意识,就不可能对完全构造的URL进行编码。

    这可以归结为:

    你应该拥有 %20 之前 ? + 之后。

    Source

        3
  •  21
  •   the Tin Man Bryan    11 年前

    我建议你 %20 .

    你在硬编码吗?

    不过,不同语言之间的差异并不是很一致。 如果我没弄错,用php urlencode() 将空格视为 + 而巨蟒的 URLCONDEX() 视他们为 % 20 .

    编辑:

    我好像搞错了。蟒蛇 URLCONDEX() (至少在2.7.2中)用途 quote_plus() 而不是 quote() 因此将空格编码为“+”。 同时,W3C的建议是“+”,如下所示: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

    事实上,您可以关注关于Python自己的问题跟踪器关于如何使用空间编码的有趣辩论: http://bugs.python.org/issue13866 .

    编辑第2页:

    我知道最常见的编码方式是“+”,但只是一个注释,它可能只是我自己,但我觉得这有点令人困惑:

    import urllib
    print(urllib.urlencode({' ' : '+ '})
    
    >>> '+=%2B+'
    
        4
  •  9
  •   Peter Mortensen John Conde    5 年前

    只能在URL的“application/x-www-form-url encoded”内容类型键值对查询部分中将空间编码为“+”。这是一个五月,不是必须的。在其余的URL中,它被编码为%20。

    在我看来,最好总是将空格编码为%20,而不是“+”,即使是在URL的查询部分,因为HTML规范(RFC-1866)规定在“application/x-www-form-url encoded”内容类型键值对中,空格字符应编码为“+”。(见第8.2.1.段。第1段。)

    这种形式数据的编码方式也在后面的HTML规范中给出。例如,查找有关HTML 4.01规范中application/x-www-form-urlencoded的相关段落,等等。

    以下是URL中的一个示例字符串,其中HTML规范允许将空格编码为加号:“ http://example.com/over/there?name=foo+bar “。所以,只有在“?”之后。,根据HTML规范,空格可以替换为加号。在其他情况下,空格应编码为%20。但由于很难正确确定上下文,所以最好不要将空格编码为“+”。

    我建议对除RFC-3986第2.3页定义的“未保留”以外的所有字符进行百分比编码。

    unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
    

    实现取决于您选择的编程语言。

    如果您的URL包含国家字符,首先将它们编码为utf-8,然后百分比编码结果。