Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
a`+;`在URL方案中/主机/路径是否表示空间?_Url_Encoding_Query String - Fatal编程技术网

a`+;`在URL方案中/主机/路径是否表示空间?

a`+;`在URL方案中/主机/路径是否表示空间?,url,encoding,query-string,Url,Encoding,Query String,我知道URL的查询字符串中的+表示一个空格。在查询字符串区域之外也是这种情况吗?也就是说,是否存在以下URL: http://a.com/a+b/c 实际代表: http://a.com/a b/c (因此,如果它实际上应该是一个+,就需要进行编码),或者它实际上代表a+b/c?您应该始终对URL进行编码 以下是Ruby对URL的编码方式: irb(main):008:0> CGI.escape "a.com/a+b" => "a.com%2Fa%2Bb" 您可以在上找到对应U

我知道URL的查询字符串中的
+
表示一个空格。在查询字符串区域之外也是这种情况吗?也就是说,是否存在以下URL:

http://a.com/a+b/c
实际代表:

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

(因此,如果它实际上应该是一个
+
,就需要进行编码),或者它实际上代表
a+b/c

您应该始终对URL进行编码

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

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

您可以在上找到对应URL编码字符的良好列表

  • +
    变成
    %2B
  • 空格变为
    %20
      • URL路径部分中的百分比编码预期将被解码,但
      • 路径组件中的任何
        +
        字符都应按字面意思处理
      明确地说:
      +
      只是查询组件中的一个特殊字符

      尝试以下操作:

      <script type="text/javascript">
      
      function resetPassword() {
         url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
      }
      function fixEscape(str)
      {
          return escape(str).replace( "+", "%2B" );
      }
      </script>
      
      
      函数resetPassword(){
      url:“submitForgotPassword.html?email=“+fixEscape(Stringwith+char)”;
      }
      函数fixesce(str)
      {
      返回转义(str)。替换(“+”,“%2B”);
      }
      
      使用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'
      

      空格字符只能在一个上下文中编码为“+”:
      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规范中查找有关
      application/x-www-form-urlencoded
      的相关段落,等等

      但是,由于很难始终正确确定上下文,因此最好不要将空格编码为“+”。最好对所有字符进行百分比编码,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;
      

      我不确定那是对的。根据RFC2396()的规定,加号不是URI路径(段)中的保留字符,而是查询组件。这似乎意味着它们不需要URL编码,因此不应该被解释为路径中的空格,只有在查询中。但是,rfc 1738将加号视为空格。这完全取决于您的编码/解码函数实现了哪一个。例如,在php中,rawurlencode遵循RFC1738,而urlencode遵循RFC2396。在您上面给我的示例中,a.com%2Fa%2Bb不是我想要的,它至少是a.com/a%2Bb。这是我正在处理的实际URL,而不是作为查询字符串中的参数传递的URL。有一点背景知识可以帮助我澄清,MacOSX Finder正在将文件系统URL返回给我。因此,如果我有一个名为“a?+b.txt”的文件,它将返回类似“file://a%3F+b.txt”的内容,而不是“file://a%3F%2B.txt”。查找程序不正确,或者查询字符串前的+实际上是加号吗?乔纳森:你确定1738说+是保留的吗?我看到:safe=“$”|“-”|“|”|“+”unreserved=alpha | digit | safe | extra以及:因此,只有字母数字、特殊字符“$-|+!*”()”和用于保留目的的保留字符可以在URL中未编码使用。“你应该总是转义”需要更多的限定,不管怎么说,答案与问题无关。+1不幸的是,许多野外的“URL编码器/编码器”并不理解这一点。例如@Stobor RFC是否曾声明
      +
      字符在查询组件中被解释为空格?或者它仅仅是一条“来自野生”的规则?@Pacerier和@bukzor:(由2396和3986修改)定义了scheme(
      http:
      )、authority(
      //server.example.com
      )和path(
      /myfile/mypage.htm
      )组件,并且没有为
      +
      字符定义任何特殊含义。HTML规范将查询组件定义为mime类型,该类型定义为“用
      +
      替换空格和RFC1738中的其他特殊字符”。所以它不是“来自野外”,而是来自一个被接受的(非RFC)标准+email@example.com作为一个参数,您将得到@Lennart建议的结果.NET方法
      Server.UrlEncode
      在路径部分也错误地将空格编码为加号,违反HTTP规则。在URL的路径组件中出现文字“+”字符是完全合法的。要让后端(或至少是PHP)接收文字+,必须对其进行三重编码:
      %25252B
      此答案与问题完全无关。请注意,在PHP中,urldecode将%2b(编码+)解码为一个空格。要避免这种情况,请使用
      rawurldecode
      。我在这里说这个是为了参考,因为这是谷歌搜索“php url解码在加号上中断”的一个高评级结果。我发现很奇怪,有两个人投票支持这个答案。它实际上与问题无关。其他字符*@-+如何/@安德鲁巴伯:你为什么觉得它无关紧要变成%2b这是错误的,原因很多
      escape
      已被弃用,您应该使用
      encodeURI
      或者在查询部分
      encodeURIComponent
      的情况下。参数字符串也应该根据进行编码。这并不能解决这个问题。而且,错误地编码URL