Pergunta

Estou ciente de que um + Na sequência de consulta de um URL, representa um espaço. Esse também é o caso fora da região da sequência de consultas? Ou seja, o seguinte URL:

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

realmente representar:

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

(e, portanto, precisa ser codificado se deve ser realmente um +), ou de fato realmente representa a+b/c?

Foi útil?

Solução

  • A codificação percentual na seção do caminho de um URL deve ser decodificada, mas
  • algum + Espera -se que os caracteres no componente do caminho sejam tratados literalmente.

Para ser explícito: + é apenas um personagem especial no componente de consulta.

Outras dicas

Você pode encontrar uma boa lista de caracteres codificados de URL correspondentes em W3schools.

  • + torna-se %2B
  • o espaço se torna %20

Os caracteres espaciais só podem ser codificados como "+" em um contexto: pares de valores-chave Application/X-Www-Form-Form-Form.

A RFC-1866 (especificação HTML 2.0), parágrafo 8.2.1. Subparágrafo 1. diz: "Os nomes e valores dos campos do formulário são escapados: os caracteres do espaço são substituídos por`+'e os caracteres reservados são escapes ").

Aqui está um exemplo de tal string em URL, onde o RFC-1866 permite a codificação de espaços como vantagens: "http://example.com/over/there?name=foo+bar". Então, somente depois"? ", Os espaços podem ser substituídos por vantagens (em outros casos, os espaços devem ser codificados para %20). Essa maneira de codificar dados de formulário também é fornecida em especificações posteriores de HTML, por exemplo, procure relevante Parágrafos sobre aplicação/x-www-forma-urlcoded na especificação HTML 4.01, e assim por diante.

Mas, como é difícil sempre determinar corretamente o contexto, é a melhor prática nunca codificar espaços como "+". É melhor codificar todo o personagem, exceto "sem reservas" definido no RFC-3986, p.2.3. Aqui está um exemplo de código que ilustra o que deve ser codificado. É apresentado na linguagem de programação Delphi (Pascal), mas é muito fácil entender como funciona para qualquer programador, independentemente da linguagem possuída:

(* 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;

Use a função Encodeuricomponent para corrigir o URL, ele funciona no navegador e 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'

Tente abaixo:

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>

Tu sempre codificarás URLs.

Aqui está como o Ruby codifica seu URL:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top