Estou ciente de que um +
na cadeia de consulta de um URL representa um espaço. Este também é o caso fora da região da string de consulta? Ou seja, faz o seguinte URL:
http://a.com/a+b/c
realmente representam:
http://a.com/a b/c
(e, portanto, precisa ser codificado se realmente for a +
), ou será que realmente representa a+b/c
?
url
encoding
query-string
Francisco Ryan Tolmasky I
fonte
fonte
rawurldecode
. Digo isso aqui para referência, porque este é um resultado bem classificado na pesquisa do google por "php url decode breaks on plus symbol".Respostas:
+
espera-se que qualquer caractere no componente de caminho seja tratado literalmente.Para ser explícito:
+
é apenas um caractere especial no componente de consulta.fonte
+
caractere é interpretado como um espaço no componente de consulta? Ou é simplesmente uma regra "do nada"?http:
), a autoridade (//server.example.com
) e o caminho (/myfile/mypage.htm
), e não define nenhum significado especial para o+
personagem. A especificação HTML define o componente de consulta como tipo mime application / x-www-form-urlencoded, que é definido como "substituir espaços por+
e outros caracteres especiais como no RFC1738". Portanto, não é "do nada", mas é de um padrão aceito (não RFC).Server.UrlEncode
codifica erroneamente os espaços como pontos positivos na parte do caminho, violando as regras HTTP.Você pode encontrar uma boa lista de caracteres codificados em URL correspondentes no W3Schools .
+
torna-se%2B
%20
fonte
%25252B
Os caracteres de espaço podem ser codificados apenas como "+" em um contexto: pares de valores-chave application / x-www-form-urlencoded.
A RFC-1866 (especificação HTML 2.0), parágrafo 8.2.1. o parágrafo 1. diz: "Os nomes e valores dos campos do formulário são escapados: caracteres de espaço são substituídos por` + 'e caracteres reservados são escapados ").
Aqui está um exemplo de uma string no URL em que o RFC-1866 permite espaços de codificação como vantagens: " http://example.com/over/there?name=foo+bar ". Portanto, somente após "?", 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 HTML posteriores, por exemplo, procure parágrafos relevantes sobre application / x-www-form-urlencoded 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 em porcentagem todos os caracteres, exceto "não reservado", definido na RFC-3986, p.2.3. Aqui está um exemplo de código que ilustra o que deve ser codificado. É fornecida na linguagem de programação Delphi (pascal), mas é muito fácil entender como funciona para qualquer programador, independentemente da linguagem possuída:
fonte
use a função encodeURIComponent para corrigir o URL, ele funciona no navegador e no node.js
fonte
Tente abaixo:
fonte
escape
está obsoleto. Em vez disso, você deve usarencodeURI
ou no caso da parte da consultaencodeURIComponent
. Além disso, a cadeia de parâmetros deve codificar de acordo com w3c .Você sempre deve codificar URLs.
Aqui está como o Ruby codifica seu URL:
fonte