Ao codificar uma sequência de consulta a ser enviada para um servidor da Web - quando você usa escape()
e quando usa encodeURI()
ou encodeURIComponent()
:
Use escape:
escape("% +&=");
OU
use encodeURI () / encodeURIComponent ()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2")
é o caso de uso típico. Esse exemplo codificará o e , o que provavelmente não é o que se pretendia! normalmente é aplicado separadamente apenas ao valor em cada par de valores-chave (a parte após cada ).=
&
encodeURIComponent
=
var params = encodeURIComponent(key) + '=' + encodeURIComponent(value);
- Talvez alguém conheça uma maneira melhor.Respostas:
fuga()
Não use!
escape()
é definido na seção B.2.1.2, escape e o texto de introdução do anexo B diz:Comportamento:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
Caracteres especiais são codificados, com exceção de: @ * _ + -. /
A forma hexadecimal para caracteres, cujo valor de unidade de código é 0xFF ou menos, é uma sequência de escape de dois dígitos:
%xx
.Para caracteres com uma unidade de código maior,
%uxxxx
é utilizado o formato de quatro dígitos . Isso não é permitido em uma sequência de consultas (conforme definido no RFC3986 ):Um sinal de porcentagem é permitido apenas se for diretamente seguido por dois hexadígitos, por cento seguido por
u
não é permitido.encodeURI ()
Use encodeURI quando quiser um URL de trabalho. Faça esta ligação:
para obter:
Não chame encodeURIComponent, pois isso destruiria o URL e retornaria
encodeURIComponent ()
Use encodeURIComponent quando desejar codificar o valor de um parâmetro de URL.
Em seguida, você pode criar o URL necessário:
E você obterá este URL completo:
http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55¶m2=99
Observe que encodeURIComponent não escapa ao
'
caractere. Um bug comum é usá-lo para criar atributos html comohref='MyUrl'
, que podem sofrer um bug de injeção. Se você estiver construindo html a partir de strings, use em"
vez de'
para aspas de atributo ou adicione uma camada extra de codificação ('
pode ser codificada como% 27).Para mais informações sobre este tipo de codificação, você pode verificar: http://en.wikipedia.org/wiki/Percent-encoding
fonte
'
por'
) antes de serem colocados em um documento HTML.A diferença entre
encodeURI()
eencodeURIComponent()
são exatamente 11 caracteres codificados por encodeURIComponent, mas não por encodeURI:Gerei esta tabela facilmente com console.table no Google Chrome com este código:
fonte
var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
Eu achei este artigo esclarecedor: Loucura de Javascript: Análise de String de Consulta
Encontrei-o quando estava tentando entender por que decodeURIComponent não estava decodificando '+' corretamente. Aqui está um extrato:
fonte
encodeURI
parece útil apenas em um caso bastante obscuro e realmente não precisa existir. Tenho algumas diferenças de opinião com ele, mas não vejo nada totalmente falso ou idiota lá. O que exatamente você acha que não faz sentido?enctype
atributo doFORM
elemento especifica o tipo de conteúdo usado para codificar o conjunto de dados do formulário para envio ao servidor. application / x-www-form-urlencoded Esse é o tipo de conteúdo padrão. Os formulários enviados com esse tipo de conteúdo devem ser codificados da seguinte forma: [...] caracteres de espaço são substituídos por `` + '', [...] e caracteres não alfanuméricos são substituídos por `% HH ', [...] Ref: HTML4 SepcencodeURIComponent não codifica
-_.!~*'()
, causando problemas ao publicar dados no php na string xml.Por exemplo:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>
Fuga geral com
encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E
Você pode ver, as aspas simples não são codificadas. Para resolver o problema, criei duas funções para resolver o problema no meu projeto, para URL de codificação:
Para URL de decodificação:
fonte
encodeURI () - a função escape () é para escape de javascript, não HTTP.
fonte
var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"
... E eu quero acessá-lo através da API do Google Ajax, assim:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;
... então eu tenho que usarescape(url)
.encodeURI(url)
não funciona com parâmetros como o que parece.Pequena tabela de comparação Java vs. JavaScript vs. PHP.
fonte
Eu recomendo não usar um desses métodos como está. Escreva sua própria função que faça a coisa certa.
O MDN deu um bom exemplo da codificação de URL mostrada abaixo.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
fonte
Lembre-se também de que todos eles codificam conjuntos diferentes de caracteres e selecione o que você precisa adequadamente. encodeURI () codifica menos caracteres que encodeURIComponent (), que codifica menos (e também diferente, para o ponto de dannyp) caracteres do que escape ().
fonte
Para fins de codificação, o javascript forneceu três funções embutidas -
escape()
- não codifica@*/+
Este método foi descontinuado após o ECMA 3, portanto deve ser evitado.encodeURI()
- não codifica~!@#$&*()=:/,;?+'
Pressupõe que o URI é um URI completo, portanto, não codifica caracteres reservados que tenham um significado especial no URI. Este método é usado quando a intenção é converter o URL completo em vez de algum segmento especial do URL. Exemplo -encodeURI('http://stackoverflow.com');
dará - http://stackoverflow.comencodeURIComponent()
- não codifica- _ . ! ~ * ' ( )
Essa função codifica um componente URI (Uniform Resource Identifier) substituindo cada instância de determinados caracteres por uma, duas, três ou quatro seqüências de escape representando a codificação UTF-8 do caractere. Este método deve ser usado para converter um componente da URL. Por exemplo, algumas entradas do usuário precisam ser anexadas Exemplo -encodeURIComponent('http://stackoverflow.com');
irá fornecer - http% 3A% 2F% 2Fstackoverflow.comToda essa codificação é realizada em UTF 8, ou seja, os caracteres serão convertidos no formato UTF-8.
encodeURIComponent difere de encodeURI, na medida em que codifica caracteres reservados e o sinal numérico # de encodeURI
fonte
Descobri que experimentar os vários métodos é uma boa verificação de sanidade, mesmo depois de ter uma boa noção de quais são seus vários usos e capacidades.
Para esse fim, achei este site extremamente útil para confirmar minhas suspeitas de que estou fazendo algo apropriadamente. Também se provou útil para decodificar uma string codificadaURIComponent'ed, o que pode ser bastante difícil de interpretar. Um ótimo marcador para ter:
http://www.the-art-of-web.com/javascript/escape/
fonte
A resposta aceita é boa. Para estender a última parte:
Se você deseja estar do lado seguro, a porcentagem de caracteres não reservados que também estão em reserva.
Você pode usar esse método para escapar deles (fonte Mozilla )
fonte
Reescrita moderna da resposta de @ johann-echavarria:
Ou, se você puder usar uma tabela, substitua
console.log
porconsole.table
(para a saída mais bonita).fonte
Inspirado na mesa de Johann , decidi estender a mesa. Eu queria ver quais caracteres ASCII são codificados.
Mostrar snippet de código
A tabela mostra apenas os caracteres codificados. Células vazias significam que os caracteres originais e codificados são os mesmos.
Só para ficar extra, eu estou adicionando outra mesa para
urlencode()
vsrawurlencode()
. A única diferença parece ser a codificação do caractere de espaço.fonte
Eu tenho essa função ...
fonte
encodeURI
que não existe, masescape
existe.