代码之家  ›  专栏  ›  技术社区  ›  Francisco Ryan Tolmasky I

URL和加号

  •  187
  • Francisco Ryan Tolmasky I  · 技术社区  · 15 年前

    我知道 +

    http://a.com/a+b/c
    

    实际代表:

    http://a.com/a b/c
    

    (因此,如果它实际上应该是一个 )或者它实际上代表了什么 a+b/c ?

    6 回复  |  直到 5 年前
        1
  •  241
  •   Andrew    8 年前

    您可以在上找到对应URL编码字符的一个很好的列表 W3Schools .

    • + 变成 %2B
    • 空间变成 %20
        2
  •  175
  •   Community datashaman    3 年前
    • URL路径部分中的百分比编码预期将被解码,但
    • 任何 + 路径组件中的字符应按字面处理。

    + 只是查询组件中的一个特殊字符。

    https://www.rfc-editor.org/rfc/rfc3986

        3
  •  25
  •   Maxim Masiutin    3 年前

    application/x-www-form-urlencoded 键值对。

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

    以下是URL中此类字符串的示例,其中RFC-1866允许将空格编码为加号:http://example.com/over/there?name=foo+酒吧”。因此,只有在“?”之后,才能用加号替换空格(在其他情况下,空格应编码为“%20”)。在以后的HTML规范中也给出了这种编码表单数据的方法,例如,查找关于 在HTML4.01规范中,等等。

    但是,由于很难始终正确确定上下文,因此最好不要将空格编码为“+”。最好对所有字符进行百分比编码,RFC-3986第2.3页中定义的“未保留”除外。下面是一个代码示例,说明应该编码什么。它是用Delphi(pascal)编程语言给出的,但对于任何程序员来说,无论使用何种语言,都很容易理解它的工作原理:

    (* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
    function UrlEncodeRfcA(const S: AnsiString): AnsiString;
    const    
      HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
    var
      I: Integer;
      c: AnsiChar;
    begin
     // percent-encoding, see RFC-3986, p. 2.1
      Result := S;
      for I := Length(S) downto 1 do
      begin
        c := S[I];
        case c of
          'A' .. 'Z', 'a' .. 'z', // alpha
          '0' .. '9',             // digit
          '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
          else
            begin
              Result[I] := '%';
              Insert('00', Result, I + 1);
              Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
              Result[I + 2] := HexCharArrA[Byte(C) and $F];
            end;
        end;
      end;
    end;
    
    function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
    begin
      Result := UrlEncodeRfcA(Utf8Encode(S));
    end;
    
        4
  •  0
  •   Baryon Lee    10 年前

    使用encodeURIComponent函数修复url,它在浏览器和node.js上工作

    res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));
    
    
    > encodeURIComponent("http://a.com/a+b/c")
    'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'
    
        5
  •  -4
  •   The Java Guy    11 年前

    <script type="text/javascript">
    
    function resetPassword() {
       url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
    }
    function fixEscape(str)
    {
        return escape(str).replace( "+", "%2B" );
    }
    </script>
    
        6
  •  -5
  •   Lennart Koopmann    15 年前

    您应始终对URL进行编码。

    以下是Ruby对URL的编码方式:

    irb(main):008:0> CGI.escape "a.com/a+b"
    => "a.com%2Fa%2Bb"