Como escapar do e comercial no URL

203

Estou tentando enviar uma mensagem GET que contém seqüências de caracteres com e comercial e não consigo descobrir como escapar do e comercial na URL.

Exemplo:

http://www.example.com?candy_name=M&M
result => candy_name = M

Eu também tentei:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

Estou usando URLs manualmente, então só preciso dos caracteres corretos.

Não posso usar nenhuma biblioteca. Como pode ser feito?

tomermes
fonte

Respostas:

350

Eles precisam ser codificados em porcentagem:

> encodeURIComponent('&')
"%26"

Portanto, no seu caso, o URL seria semelhante a:

http://www.mysite.com?candy_name=M%26M
Liquidificador
fonte
2
: -% 26 não está funcionando para mim. Existe alguma outra solução.?
Sanjiv
2
Quando eu substituir e para% 26, o seu ainda mostrando a mesma error--A potentially dangerous Request.Path value was detected from the client (&).
Sanjiv
4
@Sanjiv: Esse é um problema com o seu código, não com a porcentagem de codificação. Faça uma pergunta.
Blender
2
@Sanjiv, substitua "&" por "% 26" primeiro. Veja o código ::: NSString * message = @ "Olá Jack & Jill"; message = [mensagem stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [mensagem stringByAppendingString: @ ""]; message = [string de mensagemByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav
40

Isso não se aplica apenas ao e comercial nos URLs, mas a todos os caracteres reservados . Alguns dos quais incluem:

 # $ & + ,  / : ; = ? @ [ ]

A idéia é a mesma que codificar um &em um documento HTML, mas o contexto mudou para estar dentro do URI, além de estar dentro do documento HTML. Portanto, a codificação percentual evita problemas com a análise dentro dos dois contextos.

O lugar em que isso é útil é quando você precisa colocar um URL dentro de outro URL. Por exemplo, se você deseja postar um status no Twitter:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

Existem muitos caracteres reservados no meu Tweet, ou seja ?'():/, codifiquei todo o valor do statusparâmetro URL. Isso também é útil ao usar mailto:links que possuem um corpo ou assunto da mensagem, porque você precisa codificar os parâmetros bodye subjectpara manter intactas as quebras de linha, oe comercial, etc.

Quando um caractere do conjunto reservado (um "caractere reservado") tem um significado especial (um "objetivo reservado") em um determinado contexto, e um esquema de URI diz que é necessário usar esse caractere para algum outro propósito, então o caractere deve ser codificado em porcentagem. A codificação percentual de um caractere reservado envolve a conversão do caractere em seu valor de bytes correspondente em ASCII e a representação desse valor como um par de dígitos hexadecimais. Os dígitos, precedidos por um sinal de porcentagem ("%") usado como caractere de escape, são usados ​​no URI no lugar do caractere reservado. (Para um caractere não ASCII, ele normalmente é convertido em sua sequência de bytes em UTF-8 e, em seguida, cada valor de byte é representado como acima.) O caractere reservado "/", por exemplo, se usado no "caminho" componente de um URI, tem o significado especial de ser um delimitador entre os segmentos de caminho. Se, de acordo com um determinado esquema de URI, "/" precisar estar em um segmento de caminho, os três caracteres "% 2F" ou "% 2f" deverão ser usados ​​no segmento em vez de um "/" bruto.

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters

Alex W
fonte
4
Entre a lista acima, ! ' ( ) *não há URL codificado usando encodeURIComponent.
Amil Waduwawara
existe uma função php urlencode que resolve esse problema: use $ escapedfilename = urlencode ($ filename);
Jeremy Young
3

Você pode usar o caractere% para 'escapar' caracteres que não são permitidos em URLs. Veja [RFC 1738].

Uma tabela de valores ASCII em http://www.asciitable.com/ .

Você pode ver &26 em hexadecimal - então você precisa de M% 26M.

Peter Hull
fonte
2

Isso pode ajudar se alguém quiser em PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);
Mohamed Ramadan
fonte
1

Gostaria de adicionar um pequeno comentário sobre a solução Blender.

Você pode fazer o seguinte:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Isso gera:

http://example.com?candy_name=M%26M

O melhor de tudo isso não funciona apenas para & mas para qualquer personagem especial.

Por exemplo:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Saídas:

"http://example.com?candy_name=M%26M%3F%3E%3C"
Antonio
fonte