网址和加号

Fra*_*y I 219 url encoding query-string

我知道+URL的查询字符串中的a表示空格.这也是查询字符串区域之外的情况吗?也就是说,请执行以下URL:

http://a.com/a+b/c
Run Code Online (Sandbox Code Playgroud)

实际上代表:

http://a.com/a b/c
Run Code Online (Sandbox Code Playgroud)

(因此,如果它实际上应该是a +,则需要进行编码),还是实际上实际上代表了a+b/c

Nie*_* R. 233

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

  • +%2B
  • 空间变得 %20

  • 文字"+"字符出现在URL上的*path*组件中是完全合法的. (17认同)
  • 这个答案与这个问题完全无关. (10认同)
  • 要获得后端(或至少PHP)接收的文字+,必须进行三重编码:`%25252B` (4认同)

Sto*_*bor 166

  • URL的路径部分中的百分比编码预计将被解码,但是
  • +路径组件中的任何字符都应按字面处理.

显式:+只是查询组件中的特殊字符.

  • @Pacerier和@bukzor:[RFC 1738](http://tools.ietf.org/html/rfc1738)(由2396和3986修改)定义了方案(`http:`),权限(`// server. example.com`)和path(`/ myfile/mypage.htm`)组件,并没有为`+`字符定义任何特殊含义.HTML规范将查询组件定义为mime类型[application/x-www-form-urlencoded](http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1)定义为"用`+`替换空格和RFC1738中的其他特殊字符".所以它不是"来自野外",而是来自公认的(非RFC)标准. (44认同)
  • 可以使用`%2B`对查询字符串中的加号进行编码. (39认同)
  • @Stobor:需要引用. (11认同)
  • +1不幸的是,野外的许多"URL编码器/编码器"都不明白这一点.例如http://www.sislands.com/coin70/week6/encoder.htm http://www.keyone.co.uk/tools-url-encoder.asp http://meyerweb.com/eric/tools/dencoder / (10认同)
  • @Stobor RFC是否曾声明`+`字符被解释为查询组件中的空格?或者它只是一个"从野外"的规则? (7认同)
  • @dafrazzman *必须除非您将其表示为空格 (2认同)
  • .NET方法`Server.UrlEncode`也错误地将空格编码为路径部分中的加号,违反了HTTP规则. (2认同)

Max*_*tin 21

空格字符只能在一个上下文中编码为"+":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的相关段落,等等.

但是,因为很难始终正确地确定上下文,所以最好不要将空格编码为"+".最好对所有字符进行百分比编码,但RFC-3986,p.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;
Run Code Online (Sandbox Code Playgroud)